我試圖通過使用Windows計時器隊列來實現Windows GDI的高幀頻。相關的API是CreateTimerQueue, DeleteTimerQueueEx, CreateTimerQueueTimer,
和DeleteTimerQueueTimer
。定時器隊列,立即終止一個定時器?
定時器使用CreateTimerQueueTimer(&m_timer, m_timer_queue, TimerCallback, this, 0, 20, WT_EXECUTEINTIMERTHREAD);
創建,以達到50fps的速度。 GDI操作(一些繪畫在Backstore中,加上InvalidateRect)不能是異步的,因此我不能選擇除WT_EXECUTEINTIMERTHREAD之外的其他標誌,因此繪圖代碼不需要額外的同步操作。我們的想法是在可能的情況下達到50fps,如果不是,只需以最大速度顯示每一幀。
在動畫結束時(達到總幀數),DeleteTimerQueueTimer
被調用來銷燬計時器。
問題是DeleteTimerQueueTimer
不會立即關閉回調函數的調用。當無法達到50fps的要求時,計時器將呼叫轉換爲隊列。在回調函數內調用DeleteTimerQueueTimer
不會破壞隊列。結果,即使它決定關閉定時器,回調仍然被調用。
我該如何處理這個問題?
- 另一個說明,舊的timeSetEvent/timeKillEvent
多媒體API似乎沒有這個問題。沒有隊列,當我調用timeKillEvent時,回調函數的調用立即停止。是否有可能實現與定時器隊列相同的行爲?
謝謝,但多媒體計時器API怎麼沒有這個問題?什麼樣的間隔不是「太頻繁」? 「while(1)」加上「QueryPerformanceCounter」的成本遠高於多媒體定時器或定時器隊列定時器的成本?到目前爲止,我發現定時器隊列定時器幾乎不花費50fps的回調函數,而多媒體定時器僅花費一點CPU。 – 2009-11-06 03:15:02