分享

WINCE无窗口程序使用定时器 .

 lhzstudio 2012-05-07
对于WINCE下有窗口的程序,可以通过简单的使用API SetTimer来创建一个定时器。当定时器超时时窗口会收到一个WM_TIMER消息,我们在WM_TIMER消息中去做定时器超时处理即可。而对于无窗口的程序,因为本身没有消息循环,所以无法收到WM_TIMER消息,定时器也就无法正常工作了。

     那么无窗口程序如何通过SetTimer来定时呢?其实我们只需在无窗口程序里的主线程中加一个消息循环,来处理WM_TIMER即可,参考代码如下:

  1. UINT uTimerID = ::SetTimer(NULL,NULL,1000,NULL);   
  2. MSG   msg;   
  3. //消息循环   
  4. while (GetMessage(&msg, NULL, 0, 0))   
  5. {  
  6.     switch(msg.message)   
  7.     {  
  8.         case WM_QUIT:  
  9.             :KillTimer(NULL,uTimerID);   
  10.             break;  
  11.         case WM_TIMER:  
  12.             //TODO:Treat WM_TIMER message   
  13.             break  
  14.         default:  
  15.             break;  
  16.         }  
  17.     }  
  18. }  

 

但对于无窗口的程序这样还是比较麻烦的,使用定时器的时候还得添加消息循环的代码,其实微软还提供了一个API timeSetEvent来创建定时器,已实现更精确的定时,参考代码如下:

  1. // 需要引入的头文件和库   
  2. #include <mmsytem.h>   
  3. #pragma comment(lib,"mmtimer.lib")   
  4. // 定时器回调函数   
  5. void CALLBACK TrayKeyProc(UINT wTimerID,UINT msg,DWORD dwUser,DWORD dw1,DWORD dw2);  
  6. // 创建定时器   
  7. MMRESULT uTimerID = timeSetEvent(1000,1,TimerProc,(DWORD)this,TIME_PERIODIC | TIME_CALLBACK_FUNCTION);  
  8.   
  9. // 定时器超时处理   
  10. void CALLBACK TimerProc(UINT wTimerID,UINT msg,DWORD dwUser,DWORD dw1,DWORD dw2)  
  11. {  
  12.     // TODO:Place Code here   
  13. }  

最后别忘了调用timeKillEvent关闭定时器。

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多