控制台中使用SetTimer的提醒


SetTimer是設置定時器,每隔一段時間執行一個操作,原型如下

  UINT_PTR SetTimer(

  HWND hWnd, // 窗口句柄

  UINT_PTR nIDEvent, // 定時器ID,多個定時器時,可以通過該ID判斷是哪個定時器

  UINT uElapse, // 時間間隔,單位為毫秒

  TIMERPROC lpTimerFunc // 回調函數

  );

 

它是通過分發WM_TIMER消息來觸發回調函數的,看下面代碼

 

[cpp]  view plain copy
 
  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. }  

 

 

你認為上面的代碼會正確執行嗎,答案是不會,回調函數根本得不到執行。因為雖然使用了SetTimer,但是沒有對WM_TIMER消息進行分發,所以不會觸發回調函數,我們修改如下

 

[cpp]  view plain copy
 
  1. void CALLBACK TimerProc(HWND hWnd,UINT nMsg,UINT nTimerid,DWORD dwTime)  
  2. {  
  3.   printf("%s","abc");  
  4. }  
  5. void main()  
  6. {  
  7.     SetTimer(0, 0, 1000, &TimerProc);  
  8.     MSG   msg;     
  9.     while(GetMessage(&msg,NULL,0,0))     
  10.     {     
  11.         if(msg.message==WM_TIMER)     
  12.         {     
  13.             DispatchMessage(&msg);     
  14.         }     
  15.     }     
  16. }  

 

OK,看到上面的while循環了嗎,這里就是獲取每秒鍾發出的WM_TIMER消息,並分發下去,通知回調函數開始執行。

參考:http://blog.csdn.net/bdmh/article/details/6371443

經測試可行,完整代碼:

#include "stdafx.h"
#include "windows.h"
#include "stdio.h"

void CALLBACK TimerProc(HWND hWnd,UINT nMsg,UINT nTimerid,DWORD dwTime)
{
  printf("%s","abc");
   
}
void main()
{
    SetTimer(0, 0, 1000, &TimerProc);
    MSG   msg;   
    while(GetMessage(&msg,NULL,0,0))   
    {   
        if(msg.message==WM_TIMER)   
        {   
            DispatchMessage(&msg);   
        }   
    }   
}

如果這樣寫:

MSG msg;
GetMessage(&msg, NULL, 0, 0);

這樣消息隊列是有了,但是沒有人分發消息那還是不行,不會執行TimerProc的內容的。

----------------------------------------------------------------------------------------------

Delphi版本:


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM