C++ dll 中使用定时器的方法

方法一:

SetTimer(NULL, 0, 1000, (TIMERPROC)Timer2Proc);
VOID CALLBACK Timer2Proc(       HWND hWnd, // handle of window for timer messages       UINT uMsg, // WM_TIMER message       UINT idEvent, // timer identifier       DWORD dwTime // current system time       ){ return;}

方法二:

// DLL中的线程函数可以象这样使用TimerUINT ThreadProc(LPVOID){SetTimer(NULL, 1, 5000, NULL);MSG msg;// PeekMessage 强制系统为该线程建立消息栈PeekMessage(&msg, NULL, NULL, NULL, FALSE);while (GetMessage(&msg, NULL, NULL, NULL)){switch (msg.message){case WM_TIMER:{// 这里每5秒钟执行一次}break;}//TranslateMessage(&msg);//DispatchMessage(&msg);}KillTimer(NULL, 1);return 0;}

方法三:

创建一个线程, 反复读系统时间不就可以了? 如果定时要求不严,用Sleep就可以了

UINT TimerThread(LPVOID pama)
{
 UINT oldTickCount, newTickCount;
 oldTickCount = GetTickCount();
 while(TRUE)
 { 
  while(TRUE)
  {
   newTickCount = GetTickCount();
   if(newTickCount - oldTickCount >= 100)
   {
    oldTickCount = newTickCount;
    break;
   }
  }
  TimeProc();
 }
 return 0; 
}

大约每100ms 调用一次TimeProc();

SetTimer函数和WM_TIMER消息是Win32 api中最基本的玩意儿了,任何初学Win32 api编程的人都应该对此很熟悉吧。在这篇文章中,让我们来深入了解一下和SetTimer相关的使用和应用。



UINT_PTR SetTimer(



HWND hWnd,



UINT_PTR nIDEvent,



UINT uElapse,



TIMERPROC lpTimerFunc



);



我们经常使用的情况是hWnd不为NULL,lpTimerFunc为NULL,在这种情况下系统每隔nIDEvent毫秒会向hWnd窗口投递WM_TIMER消息。唯一需要注意的是:



1.自2000起,uElapse范围是USER_TIMER_MINIMUM到USER_TIMER_MAXIMUM。超出得话,uElapse设置为1。



2.WM_TIMER消息其实是在DispatchMessage函数中直接调用hWnd的窗口过程,并且优先级很低,只有在消息队列中没有其它消息的情况下,DispatchMessage才会考虑WM_TIMER。



3.使用相同的nIDEvent可以重置这个Timer,并且KillTimer(hWnd,nIDEvent)来销毁这个Timer。



我们再来考虑hWnd为NULL的情况:



1.首先,最重要的是KillTimer时,传入的Timer Id必须是SetTimer的返回值,而不是调用SetTimer时传入的nIDEvent参数。



2.调用SetTimer时,如果nIDEvent为0或者是其它没有被使用的Timer Id,则SetTimer会返回一个新的Timer Id。否则,就是重新设置这个Timer。



3.如果有lpTimerFunc的话,则lpTimerFunc的参数nIDEvent是SetTimer返回的值,而不是你调用SetTimer时传入的值。



最后看一下lpTimerFunc不为NULL的情况:lpTimerFunc会在DispatchMessage函数中被直接调用,而不会去调用 hWnd的窗口过程(也就是说收不到这个消息),无论hWnd是不是NULL。(这里,msdn中貌似有点问题,SetTimer的Remark部分说 lpTimerFunc会在默认窗口中被调用,而WM_TIMER中说lpTimerFunc在DispatchMessage中被调用)



应用



使用lpTimerFunc可以做一个延时的操作,或者把某些操作推迟到下一个消息循环,而不需要为窗口定义一个新的Timer Id。
原文链接: https://www.cnblogs.com/Sniper-quay/archive/2011/04/27/2030018.html

欢迎关注

微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍

原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/24648

非原创文章文中已经注明原地址,如有侵权,联系删除

关注公众号【高性能架构探索】,第一时间获取最新文章

转载文章受原作者版权保护。转载请注明原作者出处!

(0)
上一篇 2023年2月8日 上午2:30
下一篇 2023年2月8日 上午2:30

相关推荐