2009-04-21 86 views
1

可以使用Windows API設置計時器的各種方法有哪些?每種方法的優點和缺點是什麼?如何在Windows中使用計時器

我正在使用MS DevStudio的C++。

+0

@subbu:如果你真的想要得到的幫助就在這裏,所以你可能想仔細閱讀本:http://www.catb.org /~esr/faqs/smart-questions.html。 你的問題非常廣泛,很難理解你想要做什麼。所以顯然幫助你不是很容易。 – 2009-04-21 12:45:12

+0

你的問題聽起來更像是一個需求「所以要讓任何示例代碼兼容」。要客氣,5萬多人在這裏對你很好, – 2009-04-21 13:02:39

+0

+1,以改善編輯。 – 2009-04-21 13:30:24

回答

1

處理定時器的另一種方法是使用等待定時器對象。這些不需要任何消息處理,不要使用WM_TIMER或回調。因此,它們有點複雜。瞭解Windows事件系統將會很有幫助。

定時器對象有三種類型:手動復位,同步和週期性;有四個函數用於處理計時器對象:CreateWaitableTimer,SetWaitableTimer,CancelWaitableTimer和CloseHandle(還有第五個OpenWaitableTimer,但這對於很多人來說不太可能有用)。還有一組函數需要通知計時器何時到期:WaitForSingleObject,MsgWaitForSingleObject,WaitForMultipleObjects和MsgWaitForMultipleObjects是最有用的。

使用這些計時器通常的方法是:

CreateWaitableTimer (...) 
SetWaitableTimer (...) 
WaitForSingleObject (...) 
CloseHandle (...) 

與此相比,SetTimer的 - 只有這樣,才能知道,如果計時器已過期是輪詢它,無論是在一個循環或與infinte超時(即掛起線程直到計時器過去)。

優點:非常靈活,不需要有消息隊列。 缺點:很難用

0

通常,看看你要使用的API,例如MFC,Qt或GTK;他們都有計時器班。

如果你不打算使用的GUI API,我個人比較喜歡的boost ::定時器(www.boost.org)

2

有在Windows系統上的兩個定時器相關的功能:SetTimer的和KillTimer函數(我知道這些名字很奇怪 - CreateTimer和DestroyTimer會更加明智,就像在CreateWindow和DestroyWindow中一樣,但這是可用的)。

SetTimer可以以兩種模式之一運行:計時器事件可以觸發用戶定義的回調,或者可以將消息發佈到窗口。這個函數的格式是:

timer_id = SetTimer (window, event_id, interval, callback); 

使用回調:

timer_id = SetTimer (NULL, NULL, interval_in_milliseconds, callback); 

爲了得到一個WM_TIMER消息的窗口:

timer_id = SetTimer (window, event_id, interval_in_milliseconds, NULL); 

在這兩種情況下,調用線程需要當兩個變體發出WM_TIMER消息時都有一個消息隊列,默認處理程序調用回調函數。

根據您使用的操作系統,間隔值有上限和下限。 See the API documentation瞭解更多詳情。

要釋放計時器你用它完成後,請執行下列操作,如果你提供了一個窗口句柄:

KillTimer (window, event_id); // event_id is important! 

,如果你使用的回調:

KillTimer (NULL, timer_id); 

一個窗口可以有許多定時器與它關聯,請爲每個定時器使用不同的event_id。重新使用event_id將停止計時器的第一個實例,而不發佈WM_TIMER消息。

優點:相當容易使用。 缺點:間隔結束和處理WM_TIMER消息之間的延遲,分辨率很大,需要消息處理循環。