再帮CPU节省一次资源

来源:互联网 发布:梦与叶樱动作数据 编辑:程序博客网 时间:2024/04/30 00:13
    今天下午在写象棋程序时想在对话框上显示系统时间,出于个性化,我采用了图片显示,进行简单的换算,将时钟的十分位和个位以及分钟的十分位和个位分别截取出来,然后将每位数字对应一张我用PS做好了的数字图片,然后用Timer按普通方法成功实现了,也就是说每隔一秒种更新一次时间的显示以便和系统时间吻合,从运行来看发现效果也可以,下棋的时候好像也没影响电脑思考速度,但总觉得这可以更加优化,可以再节省一下资源,哦,谁叫我是一个一无所有的穷鬼哩,各位也这样一想的话就会觉得我这样做也很合情理嘛,好了,接下来说一下这个简单但有意义的技巧:
 
   首先:在对话框的初始化函数OnInitDialog();里加入:SetTimer(1,1000*(60-系统当前秒),NULL);其中第二个参数就是指定了计时器的间隔时间为(60-系统当前秒)秒。  
   然后:在对话框的计数器响应函数OnTimer();里加入每间隔(60-系统当前秒)秒需要处理的事情(语句),然后再加入:SetTimer(1,1000*(60-系统当前秒),NULL);这是重新设置           计数器的间隔时间是为了更加精确,因为在处理完上次OnTimer()函数后系统会花费一定的时间(尽管系统执行几条语句花费的时间可忽略但还是不够精确的)。
   最后:在对话框的窗口终止函数OnClose();里加入KillTimer(1);从而释放计数器
 
   我虽然是穷鬼,但我可不是小气鬼啊,刚才说了在对话框上显示系统时间我不是用的文字而是用的图片显示,现在我就将其代码捧给大家了:
说明:初始对话框函数和销毁计数器函数的代码前面已经说了,就不再祥述了。
//在窗体右下角显示时间
void CChessDlg4::OnTimer(UINT nIDEvent)
{
 // TODO: 在此添加消息处理程序代码和/或调用默认值
 CTime time;
 //获取当前系统时间
 time=CTime::GetCurrentTime();
 //将时间写入字符串
 CString str1,str2,str3,tempstr;
 int hour,minute,second,m;
 str1=time.Format("%H");
 str2=time.Format("%M");
 hour=atoi(str1);
 minute=atoi(str2);
 second=atoi(str3); 
 //为了更加准时的更新时间的显示再次更改计数器的时间间隔
 SetTimer(1,1000*(60-second),NULL);
 
 //显示成个性化的时间
 //时的显示
 if(hour<=9)
 {
  m_kodak18.SetImage("images//dialog//time_00.gif");
  m_kodak18.Display();
  
  tempstr="images//dialog//time_"+str1+".gif";
  m_kodak19.SetImage(tempstr);
  m_kodak19.Display();

 }
 else
 {
  m=hour/10;
  tempstr.Format("%d",m);
  tempstr="images//dialog//time_0"+tempstr+".gif";
  m_kodak18.SetImage(tempstr);
  m_kodak18.Display();
  m=hour%10;
  tempstr.Format("%d",m);
  tempstr="images//dialog//time_0"+tempstr+".gif";
  m_kodak19.SetImage(tempstr);
  m_kodak19.Display();
 
 }
 
 //连接符的显示
 m_kodak20.SetImage("images//dialog//time_:.gif");
 m_kodak20.Display();
 
 //分的显示
 if(minute<=9)
 {
  m_kodak21.SetImage("images//dialog//time_00.gif");
  m_kodak21.Display();
  tempstr="images//dialog//time_"+str2+".gif";
  m_kodak22.SetImage(tempstr);
  m_kodak22.Display();
 }
 else
 {
  m=minute/10;
  tempstr.Format("%d",m);
  tempstr="images//dialog//time_0"+tempstr+".gif";
  m_kodak21.SetImage(tempstr);
  m_kodak21.Display();
  m=minute%10;
  tempstr.Format("%d",m);
  tempstr="images//dialog//time_0"+tempstr+".gif";
  m_kodak22.SetImage(tempstr);
  m_kodak22.Display();
 
 }     
 
 CDialog::OnTimer(nIDEvent);
}
 
不是我舍不得公布真正有价值的象棋核心程序,而是它牵连广且写的烂,怕误导朋友们哦。