對於WINCE下有視窗的程式,可以通過簡單的使用API SetTimer來建立一個定時器。當定時器逾時時視窗會收到一個WM_TIMER訊息,我們在WM_TIMER訊息中去做定時器逾時處理即可。而對於無視窗的程式,因為本身沒有訊息迴圈,所以無法收到WM_TIMER訊息,定時器也就無法正常工作了。
那麼無視窗程序如何通過SetTimer來定時呢?其實我們只需在無視窗程序裡的主線程中加一個訊息迴圈,來處理WM_TIMER即可,參考代碼如下:
UINT uTimerID = ::SetTimer(NULL,NULL,1000,NULL);<br />MSG msg;<br />//訊息迴圈<br />while (GetMessage(&msg, NULL, 0, 0))<br />{<br />switch(msg.message)<br />{<br />case WM_QUIT:<br /> :KillTimer(NULL,uTimerID);<br />break;<br />case WM_TIMER:<br />//TODO:Treat WM_TIMER message<br />break<br />default:<br />break;<br />}<br />}<br />}
但對於無視窗的程式這樣還是比較麻煩的,使用定時器的時候還得添加訊息迴圈的代碼,其實微軟還提供了一個API timeSetEvent來建立定時器,已實現更精確的定時,參考代碼如下:
// 需要引入的標頭檔和庫<br />#include <mmsytem.h><br />#pragma comment(lib,"mmtimer.lib")<br />// 定時器回呼函數<br />void CALLBACK TimerProc(UINT wTimerID,UINT msg,DWORD dwUser,DWORD dw1,DWORD dw2);<br />// 建立定時器<br />MMRESULT uTimerID = timeSetEvent(1000,1,TimerProc,(DWORD)this,TIME_PERIODIC | TIME_CALLBACK_FUNCTION);</p><p>// 定時器逾時處理<br />void CALLBACK TimerProc(UINT wTimerID,UINT msg,DWORD dwUser,DWORD dw1,DWORD dw2)<br />{<br /> // TODO:Place Code here<br />}
最後別忘了調用timeKillEvent關閉定時器。