Programming分類文章 顯示方式:簡文 | 列表

May 19,2009

高精度Timer

在撰寫多媒體相關的程式的時候,常常會需要一些高精確度的計時器來做時機掌握。

一般來說,WM_TIMER是絕對出局的,這個計時器一來精度不高,二來送來的Windows Message還有可能被忽略。

接來下則是MultiMedia Timer,這個計時器可以很準確的計時到1ms左右的時間
而且又有方便的callback或是event notify可以在時間到時通知使用者。使用上算是很方便的。

最精確計時方式則要屬QueryPerformanceCounter了,但是要用它來記時,必需要維持一個busy loop不斷的Query這個counter。如此一來在單CPU的機器上可能會造成CPU資源被吃的一乾二淨。也因此比較好的做法是:

1、使用一個while loop,在內部使用1ms的MultiMedia Timer定時計時。同時query一次PerformanceCounter並將觸發時間減去這次測得的performance tick。
2、當要觸發的時間剩不到1ms時,開始進入QueryPerformanceCounter的busy loop,於觸發時間歸零時,向外觸發event或是delegate。

另外有一個小撇步,當只需要一次性短程的計時器時,可以用Thread.Sleep()來達成,但是在使用前可以呼叫timeBeginPeriod(1)來將全系統的計時器精度調整至1ms。但是由於這會影響到全系統的timer精度(當然越小對於系統的負擔越大),所以在使用完畢後記得呼叫timeEndPeriod()來還原系統timer的精度。

Posted by toki_kanno at 樂多Roodo!13:44回應(0)引用(0)
 [1]