VC++控制檯程式中使用定時器

lys07962000發表於2014-10-16


http://blog.chinaunix.net/uid-20437338-id-1946459.html


我現在專案是一個控制檯程式,用到的Win32API都是與介面無關的,今天需要加入定時器重新整理的功能,由於沒有訊息迴圈,所以WM_TIMER訊息應該如何處理呢?綜合了下網上找到的資料,寫了個簡單的demo,個人以為這種在一個執行緒中建立定時器,再通過指定的回撥函式來處理定時器觸發的模式是比較好的。
 
#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,111,3000,TimerProc);   
    BOOL  bRet;   
    
    
while(   (bRet = GetMessage(&msg,NULL,0,0))!=   0)   
   
{     
        
if(bRet==-1)   
       
{   
            
//   handle   the   error   and   possibly   exit   
        }
   
        
else   
        
{    
            TranslateMessage(
&msg);     
            DispatchMessage(
&msg);     
        }
   
    }
   
    KillTimer(NULL,timerid);   
    printf(
"thread   end   here\n");   
    
return   0;   
}


int    main()   
{   
    DWORD   dwThreadId;   
    printf(
"use   timer   in   workthread   of   console   application\n");   
    HANDLE   hThread  
=    CreateThread(NULL,0,Thread,0,0,&dwThreadId);
    _getch(); 
    
return 0;
}
  
用執行緒實現定時器:

http://blog.csdn.net/markman101/article/details/6220295



#include "stdafx.h"
#include<iostream>
#include<windows.h>
using namespace std;




void CALLBACK TimeProc( 
  HWND hwnd,       
  UINT message,     
  UINT idTimer,     
  DWORD dwTime);
int main()
{
int sen = SetTimer(NULL,1,1000,TimeProc);
//Sleep(5000);


MSG msg;
while(GetMessage(&msg,NULL,0,0))
{
if(msg.message==WM_TIMER)
{
DispatchMessage(&msg);
cout<<"kill定時器!"<<endl; 
KillTimer(NULL, sen);
}


}
return 0;


void CALLBACK TimeProc( 
  HWND hwnd,       
  UINT message,     
  UINT idTimer,     
  DWORD dwTime)
{    
cout<<"觸發定時器!"<<endl; 
}


相關文章