轉自部落格:http://www.cnblogs.com/phinecos/archive/2008/03/08/1096691.html
作者:洞庭散人
“我現在項目是一個控制台程式,用到的Win32API都是與介面無關的,今天需要加入定時器重新整理的功能,由於沒有訊息迴圈,所以WM_TIMER訊息應該如何處理呢?綜合了下網上找到的資料,寫了個簡單的demo,個人以為這種在一個線程中建立定時器,再通過指定的回呼函數來處理定時器觸發的模式是比較好的。”
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)
{
printf("Error:the thread will quit,error id is %d/n",GetLastError());
break;
}
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,NULL,0,NULL);
_getch();
return 0;
};
本人在瞭解了作者的意圖以後,也做了一個類封裝:
#include <Windows.h>
#include <stdio.h>
#include <conio.h>
class CTimer
{
public:
CTimer();
void CreateTimerThread(int* pi);
static DWORD CALLBACK TimeThread(PVOID pvoid);
static void CALLBACK TimeProc(HWND hWnd,UINT uMsg,UINT_PTR idEvent,DWORD dwTime);
};
CTimer::CTimer()
{
}
void CTimer::CreateTimerThread(int* pi)
{
HANDLE hand = CreateThread(NULL,0,CTimer::TimeThread,pi,0,NULL);
}
DWORD CALLBACK CTimer::TimeThread(PVOID pvoid)
{
int* pi = (int*)pvoid;
int itm = *pi;
MSG msg;
PeekMessage(&msg,NULL,WM_USER,WM_USER,PM_NOREMOVE);
UINT timeid = SetTimer(NULL,111,itm,CTimer::TimeProc);
BOOL bRet;
while ((bRet = GetMessage(&msg,NULL,0,0))!=0)
{
if (bRet == -1)
{
printf("Error:the thread will quit,error id is %d/n",GetLastError());
break;
}
else
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
KillTimer(NULL,timeid);
printf("thread end here/n");
return 0;
}
void CALLBACK CTimer::TimeProc(HWND hWnd, UINT uMsg, UINT_PTR idEvent, DWORD dwTime)
{
printf("WM_TIMER in work thread count/n");
}
int main()
{
int iTime = 1000;
int* pi = &iTime;
CTimer* ptime = new CTimer;
ptime->CreateTimerThread(pi);
_getch();
return 0;
};
感謝洞庭散人...