在網上看了settimer的一些用法發現能用的真沒有,,,,可能是我沒找對地方,大部分都是無腦復制粘貼,浪費了很多時間,如果你是一個對這種定時器一無所知的小白,那么請你看進來一定不會讓你失望的!
-
實用settimer的第一步引入頭文件:#include <Windows.h>
-
然后我們來看一下settimer及其回調函數的使用:
首先我們來看settimer的原型:(如下所示)(這個僅僅是窗口的一個定時器函數,我們現在是想把它用到控制台程序的而一般沒有窗口的線程系統是不會給他指定消息隊列的)
1 UINT_PTR SetTimer( 2 HWND hWnd, // 窗口句柄 3 UINT_PTR nIDEvent, // 定時器ID,多個定時器時,可以通過該ID判斷是哪個定時器 4 UINT nElapse, // 時間間隔,單位為毫秒 5 TIMERPROC lpTimerFunc // 回調函數 6 }
其函數的參數意義就如同上面所說的一樣,我們常用的用法是SetTimer(m_hWnd,1,1000,NULL); //一個1秒觸發一次的定時器(在MFC中是不一樣的這一點要注意),若最后一個參數是NULL,那么則默認調用的是ontime函數,但是當我們要調用我們自己的回調函數時可以用如下的函數:void CALLBACK TimerProc(HWND hWnd,UINT nMsg,UINT nTimerid,DWORD dwTime) { 里面寫下自己的內容 };網上大部分就是寫到這里其實只但這里我們並不能成功的調用自己的回調函數,還要經過如下操作才可以:(雖然使用了SetTimer,但是沒有對WM_TIMER消息進行分發,所以不會觸發回調函數)
1 void CALLBACK TimerProc(HWND hWnd,UINT nMsg,UINT nTimerid,DWORD dwTime) 2 { 3 printf("%s","abc"); 4 5 } 6 void main() 7 { 8 SetTimer(0, 0, 1000, &TimerProc); 9 MSG msg; 10 while(GetMessage(&msg,NULL,0,0)) 11 { 12 if(msg.message==WM_TIMER) 13 { 14 DispatchMessage(&msg); 15 } 16 } 17 }
其中的DispatchMessage(&msg)就是分發消息,對vM_TIMER消息進行分發,分發到回調函數,在其中要注意GetMessage()是阻塞的,這個函數會一直等待消息知道收到消息為止,而非阻塞的是函數PeekMessage()函數,僅僅是檢測是否有消息而不是一直等待消息。
參考文章:https://blog.csdn.net/dog250/article/details/5303603