使用者定時器SetTimer及Windows訊息的傳遞處理
阿新 • • 發佈:2019-02-13
#include <windows.h> #include <stdio.h> #include <conio.h> int count =0; VOID CALLBACK TimerProc(HWND hwnd,UINT uMsg,UINT_PTR idEvent,DWORD dwTime) { count++; printf("WM_TIMER in work thread count=%d\n",count); } DWORD CALLBACK Thread(PVOID pvoid) { MSG msg; PeekMessage(&msg,NULL,WM_USER,WM_USER,PM_NOREMOVE); //檢查執行緒訊息佇列,非阻塞式函式 UINT timerid=SetTimer(NULL,1,1000,TimerProc); BOOL bRet; while( (bRet = GetMessage(&msg,NULL,0,0))!= 0) //阻塞式函式,與PeekMessage有區別 { if(bRet==-1) { // handle the error and possibly exit } else { TranslateMessage(&msg); //翻譯,將需要翻譯的訊息翻譯,並將訊息翻譯後得到的字元訊息寄送到呼叫執行緒的訊息佇列裡,當下一次執行緒呼叫函式GetMessage或PeekMessage時被讀出。 DispatchMessage(&msg); //將訊息分發給系統,然後由作業系統將訊息發給視窗處理過程 } } KillTimer(NULL,timerid); printf("thread end here\n"); return 0; } int main() { DWORD dwThreadId; printf("use timer in work thread of console application\n"); HANDLE hThread = CreateThread(NULL,0,Thread,0,0,&dwThreadId); getch(); return 0; } /* 舉個例子,大致意思如下: 比如在while迴圈時,鍵盤按鍵被按下,那麼GetMessage就會從系統獲取到該訊息,然後TranslateMessage將訊息翻譯成字元訊息, 也就是ASCII碼,並將該訊息寄送到Thread的訊息佇列,接著DispatchMessage會將msg訊息分發給作業系統,作業系統再將該訊息送到 相應的視窗處理過程進行處理 */