VC中加入定时机制的几种方法

 
  
 
  
 
  


 
  
 
  
 
  
 
  
 
  
 
  

 
  
 
  
 
  



 
  





ThreadFunction
int i;
i=5;//触发5
while(i--)
{
    Sleep(5000);//间隔5
    ::MessageBox (NULL,"我被定时触发了!","定时触发演示",MB_OK);
}
ExitFlag=FALSE;//ExitFlag是一全局变量,通知主线程结束运行。
return 0;
 
  
 
  
#include
// CG: The following line was added by the Windows Multimedia component.
 
  
1.       定义定时器参数
#define TEN_MILLI_SECOND 200 //定时器间隔
#define TIMER_ACCURACY 1      //定时器精度
UINTTimer_ID;         //定时器句柄
 
  
2.       通过多媒体定时器设备函数timeGetDeviceCaps获得本微机的最大分辨率。
TIMECAPS tc; //定时器分辨率的结构
If(timeGetDeviceCaps(&tc,sizeof(TIMECAPS))
   = = TIMERR_NOERROR)
{
 //获得本系统的最小定时器分辨率,所有应用必须大于等于该分辨率
 wAccuracy=min(max(tc.wPeriodMin,
 TIMER_ACCURACY),tc.wPeriodMax);
 //设定本应用的所需的定时器分辨率,本例为微机的所允许的最大分辨率
 timeBeginPeriod(wAccuracy);
}
3.       应用多媒体定时器的timeSetEvent函数设定事件的触发方式,它的函数原形是:
MMRESULT timeSetEvent( UINT uDelay,
                   UINT uResolution,
                   LPTIMECALLBACK lpTimeProc,
                   DWORD dwUser, UINT fuEvent);
uDelay        用于设定事件触发间隔;
uResolution   用于设定程序所需的最小分辨率;
lpTimeProc    调用回调函数;
dwUser        用户提供的回调数据;
fuEvent       事件触发方式,在Visual C++中有两种方式:
              TIME_ONESHOT:事件仅触发一次
              TIME_PERIODIC:每隔一定时间触发一次
TimeSetEvent函数返回定时器句柄;
 
具体应用:
Timer_ID=timeSetEvent(TEN_MILLI_SECOND,wAccuracy,
                  ( LPTIMECALLBACK)CatchMMTimer,
                  (DWORD)hWnd,TIME_PERIODIC);
4.       声明一个全局的回调(Callback)函数
void CALLBACK TwoHundredMilliSecondProc (UINT wTimerID,UINT nMsg,DWORD dwUser,DWORD dw1,DWORD dw2),在回调函数中调用事件触发消息且在回调函数中语句尽量简单,不要在回调函数内做一些耗时的操作;
5.       添加用户消息CatchMMTimer函数,用来接收多媒体定时器的事件通知。其过程是首先在类的头文件定义:#define MYMSG_TIMER WM_USER+101,然后在类头文件的AFX_MSG块中说明消息处理函数:afx_msg LRESULT OnMymsgTimer(WPARAM wParam, LPARAM lParam); 在类实现的消息映射块中,使用ON_MESSAGE宏指令将消息映射到消息处理函数中:ON_MESSAGE (MYMSG_TIMER, OnMymsgTimer)。最后在相应类中实现消息处理函数。关于用户自定义消息具体可参考Visual C++ s书籍。如:PostMessage((HWND)dwUser,MYMSG_TIMER,0,0); //PostMessage发送消息
6.       定时器的任务完成后,要及时删除,否则占用太多内存,系统会越来越慢。删除定时器分两步,首先调用 timeKillEvent函数删除定时器句柄,然后用timeEndPeriod函数删除定时器的分辨率。具体应用如下:
timeKillEvent(Timer_ID);
timeEndPeriod(wAccuracy);
SetTimer(100,1000,NULL);//

你可能感兴趣的:(VC中加入定时机制的几种方法)