Win32控制台中使用定時器的方法


在MFC中用OnTimer()函數就可以很方便的實現定時事件,但在Win32控制台工程中沒有消息循環,MSDN里也不推薦把SetTimer()用在Console Applications里。

同理,在DLL工程中創建定時器也需用這種方法,因為DLL沒有窗口,沒窗口就沒有消息循環,沒消息循環就收到不到定時消息。如果DLL有窗口的話,就可以在SetTimer()時指定窗口句柄也行,直接用GetForegroundWindow()得到句柄。

方法:在一個單獨的線程中創建定時器,再通過指定的回調函數來處理定時事件。

 

  1. #include <stdio.h>  
  2. #include <windows.h>  
  3. #include <conio.h>  
  4.   
  5. UINT cnt = 0;  
  6.   
  7. //定時器回調函數  
  8. void CALLBACK TimeProc(HWND hwnd, UINT message, UINT idTimer, DWORD dwTime);  
  9.   
  10. //線程回調函數  
  11. DWORD CALLBACK ThreadProc(PVOID pvoid);    
  12.   
  13.   
  14. //主函數  
  15. int main()  
  16. {  
  17.     //創建線程  
  18.     DWORD dwThreadId;    
  19.     HANDLE hThread = CreateThread(NULL, 0, ThreadProc, 0, 0, &dwThreadId);   
  20.     printf("hello, thread start!\n");  
  21.       
  22.     //得到鍵盤輸入后再退出  
  23.     getch();         
  24.     return 0;  
  25. }      
  26.   
  27. //線程  
  28. DWORD CALLBACK ThreadProc(PVOID pvoid)  
  29. {  
  30.     //強制系統為線程簡歷消息隊列  
  31.     MSG msg;  
  32.     PeekMessage(&msg, NULL, WM_USER, WM_USER, PM_NOREMOVE);   
  33.       
  34.     //設置定時器  
  35.     SetTimer(NULL, 10, 1000, TimeProc);  
  36.       
  37.     //獲取並分發消息  
  38.     while(GetMessage(&msg, NULL, 0, 0))  
  39.     {  
  40.         if(msg.message == WM_TIMER)  
  41.         {  
  42.             TranslateMessage(&msg);    // 翻譯消息  
  43.             DispatchMessage(&msg);     // 分發消息  
  44.         }  
  45.     }  
  46.       
  47.     KillTimer(NULL, 10);  
  48.     printf("thread end here\n");  
  49.     return 0;  
  50. }  
  51.   
  52. //定時事件  
  53. void CALLBACK TimeProc(HWND hwnd, UINT message, UINT idTimer, DWORD dwTime)  
  54. {  
  55.     cnt ++;  
  56.     printf("thread count = %d\n", cnt);  
  57. }  
#include <stdio.h>
#include <windows.h>
#include <conio.h>

UINT cnt = 0;

//定時器回調函數
void CALLBACK TimeProc(HWND hwnd, UINT message, UINT idTimer, DWORD dwTime);

//線程回調函數
DWORD CALLBACK ThreadProc(PVOID pvoid);  


//主函數
int main()
{
    //創建線程
    DWORD dwThreadId;  
    HANDLE hThread = CreateThread(NULL, 0, ThreadProc, 0, 0, &dwThreadId); 
    printf("hello, thread start!\n");
    
    //得到鍵盤輸入后再退出
    getch();       
    return 0;
}    

//線程
DWORD CALLBACK ThreadProc(PVOID pvoid)
{
    //強制系統為線程簡歷消息隊列
    MSG msg;
    PeekMessage(&msg, NULL, WM_USER, WM_USER, PM_NOREMOVE); 
    
    //設置定時器
    SetTimer(NULL, 10, 1000, TimeProc);
    
    //獲取並分發消息
    while(GetMessage(&msg, NULL, 0, 0))
    {
        if(msg.message == WM_TIMER)
        {
            TranslateMessage(&msg);    // 翻譯消息
            DispatchMessage(&msg);     // 分發消息
        }
    }
    
    KillTimer(NULL, 10);
    printf("thread end here\n");
    return 0;
}

//定時事件
void CALLBACK TimeProc(HWND hwnd, UINT message, UINT idTimer, DWORD dwTime)
{
    cnt ++;
    printf("thread count = %d\n", cnt);
}


jpg改rar


免責聲明!

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



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