方法一:cwnd類提供的成員函式settimer實現定時器功能,只能在cwnd類或其派生類中呼叫。啟動定時器就需要使用cwnd類的成員函式settimer。cwnd::settimer的原型如下:方法二:windows api函式settimer來實現。
uint_ptr settimer(uint_ptr nidevent,//指定乙個非零的定時器id
uint nelapse,//指定間隔時間,單位為毫秒
void (callback* lpfntimer)(hwnd,
uint,
uint_ptr,
dword
)//指定乙個**函式的位址,
//如果該引數為null,則wm_timer訊息被傳送到應用程式的訊息佇列,並被cwnd物件處理。
//引數lpfntimer如果此函式成功則返回乙個新的定時器的id,我們可以使用此id通過killtimer成員函式來銷毀該定時器,如果函式失敗則返回0。
);
1 通過wm_timer訊息的訊息響應函式
2 通過**函式。如果要啟動多個定時器就多次呼叫settimer成員函式。另外,在不同的cwnd中可以有id相同的定時器,並不衝突。
如果呼叫cwnd::settimer函式時最後乙個引數為null,則通過wm_timer的訊息處理函式來處理定時事件。新增wm_timer訊息的處理函式的方法是,在vs2010工程的class view類檢視中找到要新增定時器的類,點選右鍵,選擇properties,顯示其屬性頁,然後在屬性頁工具欄上點選messages按鈕,下面列表就列出了所有訊息,找到wm_timer訊息,新增訊息處理函式。新增後,cpp檔案中會出現類似如下內容:銷毀定時器需使用cwnd類的killtimer成員函式,cwnd::killtimer函式的原型如下:begin_message_map(cexample44dlg, cdialogex)
......
on_wm_timer()
end_message_map()
void cexample44dlg::ontimer(uint_ptr nidevent)
之後就可以在ontimer函式中進行相應的處理了。ontimer的引數nidevent為定時器id,即在settimer成員函式中指定的定時器id,如果有多個定時器,我們可以像下面這樣處理:
void cexample44dlg::ontimer(uint_ptr nidevent)
cdialogex::ontimer(nidevent);
}
如果呼叫cwnd::settimer函式時最後乙個引數不為null,則需要定義**函式。**函式的形式如下:
void callback export timerproc(
hwnd hwnd, // handle of cwnd that called settimer
uint nmsg, // wm_timer
uint nidevent // timer identification
dword dwtime // system time
);
引數hwnd為呼叫settimer成員函式的cwnd物件的控制代碼,即擁有此定時器的視窗的控制代碼;引數nmsg為wm_timer,而且總是為wm_timer;引數nidevent為定時器id;引數dwtime為系統啟動以來的毫秒數,即gettickcount函式的返回值。
這樣cwnd::settimer函式最後乙個引數就可以為timerproc。**函式的名稱不一定為timerproc,可以取其他名字,但返回值型別、引數的型別和個數不能改變。**函式為全域性函式,需要寫在使用它的位置的前面,或者寫在後面然後在使用之前宣告。
bool killtimer(uint_ptr nidevent);引數nidevent為要銷毀的定時器的id,是呼叫cwnd::settimer函式時設定的定時器id。如果定時器被銷毀則返回true,而如果沒有找到指定的定時器則返回false。如果要銷毀多個定時器,則多次呼叫killtimer函式並分別傳入要銷毀的定時器的id。
使用api函式settimer啟動定時器,settimer函式的原型如下:
uint_ptr settimer(如果呼叫settimer函式時最後乙個引數為null,我們需要自己為wm_timer訊息新增處理函式,要注意的是,wm_timer訊息的附加資料wparam為定時器id,lparam為**函式的指標,如果呼叫settimer時**函式為null,那麼lparam也為null。hwnd hwnd, //與定時器關聯的視窗的控制代碼
uint_ptr nidevent, //非零的定時器id,如果hwnd等於null,且還不存在id為nidevent的定時器,那麼nidevent引數被忽略,然後生成乙個新id的定時器,而如果hwnd不為null,且hwnd指定的視窗已存在id為nidevent的定時器,那麼這個已存在的定時器被新定時器所取代。
uint uelapse, //cwnd::settimer函式
timerproc lptimerfunc //cwnd::settimer函式
而如果呼叫settimer函式時最後乙個引數不為null,我們就需要定義**函式。**函式的定義同mfc定時器。
銷毀定時器使用killtimer api函式,原型如下:
bool killtimer(hwnd hwnd,uint_ptr uidevent);引數hwnd為與定時器關聯的視窗的控制代碼,與啟動定時器時settimer函式的hwnd引數值相同;引數uidevent為要銷毀的定時器的id,如果傳遞給settimer的引數hwnd有效,則uidevent應與傳遞給settimer的引數nidevent相同,而如果settimer的引數hwnd為null,則uidevent應為settimer返回的定時器id。該函式成功則返回true,否則返回false。
定時器使用
dword winapi checksendinfovector lpvoid lpparameter return 0 void callback dotimer hwnd hwnd,uint umsg,uint ptr idevent,dword dwtime timerproc的引數hwnd是...
Delphi Timer定時器使用
timer定時器是乙個非視覺化元件,能夠定時觸發ontimer事件,完成模擬時鐘 系統延時 倒計時等工作。在system選項卡中。1 timer的主要屬性 1 enabled屬性 當值為true時,開啟定時器,否則關閉定時器。預設值為true。2 interval屬性 控制ontimer事件觸發的時...
workman定時器使用
workerman 定時器例子,可單獨使用,稍加改善可以開啟乙個守護程序,用來做一些定時發布等等類似的任務,使用方便,不需要額外的擴充套件或者類似 crontab 等工具。以下是測試程式 php view plain copy use workerman autoloader use workerm...