::OnTimer

::OnTimer

OnTimer()函數用於實現定時控制功能,定時控制功能主要下面三個函數共同實現:

介紹


OnTimer()函數用於實現定時控制功能,定時控制功能主要由下面三個函數共同實現:
SetTimer, KillTimer()和OnTimer().
粗略的說,Settimer是設置一個計時器並開始執行計時器Ontimer中的代碼,Ontimer是計時器所執行的代碼。KillTimer用於停止計時器。
或者說Settimer是設置定時器的,Ontimer是響應Settimer消息的。當Settimer設置的時間到了,就會自動調動Ontimer()函數。

原型


先了解下SetTimer這個API函數的原型
UINT_PTR SetTimer(
HWNDhWnd, // 窗口句柄
UINT_PTR nIDEvent, // 定時器ID,多個定時器時,可以通過該ID判斷是哪個定時器
UINTuElapse, // 時間間隔,單位為毫秒
TIMERPROC lpTimerFunc // 回調函數
);

舉例


例如
SetTimer(m_hWnd,1,1000,NULL); //一個1秒觸發一次的定時器
MFC程序中SetTimer被封裝在CWnd類中,調用就不用指定窗口句柄了
於是SetTimer函數的原型變為:
UINT SetTimer(UINT nIDEvent,UINT nElapse,void(CALLBACKEXPORT *lpfnTimer)(HWND,UINT ,YINT ,DWORD))
當使用SetTimer函數的時候,就會生成一個計時器。
SetTimer函數中
nIDEvent指的是計時器的標識,也就是名字。
nElapse指的是時間間隔,也就是每隔多長時間觸發一次事件。
第三個參數是一個回調函數,在這個函數里,放入你想要做的事情的代碼,你可以將它設定為NULL,也就是使用系統默認的回調函數,系統默認的是OnTime函數。
這個函數怎麼生成的呢?
你需要在需要計時器的類的生成onTime函數:
ClassWizard里,選擇需要計時器的類,添加WM_TIME消息映射,就自動生成OnTime函數了。
然後在函數里添加代碼,讓代碼實現功能。
每隔一段時間(SetTimer設置的時間)就會自動執行一次。
例:
SetTimer(1,1000,NULL);
1:計時器的名稱;
1000:時間間隔,單位是毫秒;
NULL:使用onTime函數。
當不需要計時器的時候調用KillTimer(nIDEvent);
例如:KillTimer(1); //此處的ID號“1 ”應與SetTimer()中的ID號一致
如果需要要加入兩個或者兩個以上的timer怎麼辦?
繼續用SetTimer函數吧,上次的timer的ID是1,這次可以是2,3,4......
SetTimer(2,1000,NULL); //ID為2,定時1000ms
SetTimer(3,500,NULL); //ID為3,定時500ms
WINDOWS會協調他們的。當然OnTimer函數體也要發生變化,要在函數體內添加每一個timer的處理代碼:
OnTimer(nIDEvent)
{
switch(nIDEvent)
{
case 1:........;
break;
case 2:.......;
break;
case 3:......;
break;
}
}
在控制台中使用定時器不能簡單的SetTimer了事,這在控制台里這種SetTimer的方式是有點麻煩的,需要自己寫消息循環投遞WM_TIMER消息。其實在控制台里可以使用多媒體時鐘來計時:
example:
//啟動計時器
MMRESULT nIDTimerEvent = timeSetEvent(
1000,//延時1秒
0,
TimeProc,
0,
(UINT)TIME_PERIODIC);
if( nIDTimerEvent == 0 )
cout<<"啟動計時器失敗"<
//回調過程(時鐘到來,回調函數被系統自動調用)
void CALLBACK TimeProc(
UINT uID,
UINT uMsg,
DWORD dwUser,
DWORD dw1,
DWORD dw2
)
{
cout<<"時鐘到來"<
}
當然了,你要是習慣於SetTimer,那就用SetTimer吧:
下面是我在Console下用SetTimer寫的一個例子:
#include
using namespace std;
void CALLBACK TimeProc(
HWND hwnd,
UINT message,
UINT idTimer,
DWORD dwTime);
int main()
{
SetTimer(NULL,1,1000,TimeProc);
MSG msg;
while(GetMessage(&msg,NULL,0,0))
{
if(msg.message==WM_TIMER)
{
DispatchMessage(&msg);
}
}
return 0;
}
void CALLBACK TimeProc(
HWND hwnd,
UINT message,
UINT idTimer,
DWORD dwTime)
{
cout<<"a timer comming"<
}
  • 目錄