::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<<"啟動計時器失敗"<<endl;

//回調過程(時鐘到來,回調函式被系統自動調用)

void CALLBACK TimeProc(

UINT uID,

UINT uMsg,

DWORD dwUser,

DWORD dw1,

DWORD dw2

)

{

cout<<"時鐘到來"<<endl;

}

當然了,你要是習慣於SetTimer,那就用SetTimer吧:

下面是我在Console下用SetTimer寫的一個例子:

#include <windows.h>

#include <iostream>

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"<<endl;

}

相關詞條

熱門詞條

聯絡我們