2010-10-05 44 views
1

我有一個計時器類,它使用CreateTimerQueueTimer和DeleteTimerQueueTimer。按照預期,我會收到類對象的回調。如何確保計時器在應用程序忙於繪製UI或執行一些精細渲染等時不會觸發?我不關心高分辨率,只是在應用程序空閒時它必須啓動。定時器在Win32中,C++

我正在使用以下來創建計時器。

BOOL timerCreated = ::CreateTimerQueueTimer(&mTimerRef, 
              NULL, 
              TimerCallback, 
              (PVOID)(this), 
              inFireDelay * 1000, 
              inInterval * 1000, 
              WT_EXECUTEINUITHREAD); 
// using timer queues because i dont have access to a hWnd in this class. 

對不起,我不能僅使用MFC/.NET stictly win32。

謝謝, Abhinay。

回答

3

這通常是不可能的。回調是在一個線程池線程上進行的,你不能揮動一面魔法標誌並詢問「請不要點燃」。即使有可能,這是一個不可避免的競爭條件,線程可能已經啓動,但沒有得到執行的機會。

你所能做的就是阻塞線程,在你的回調中使用臨界區或互斥量。當你的UI線程'不空閒'時獲取互斥體是非常不切實際的,你必須在你的消息循環中這樣做。一般來說,你只想保護共享狀態,在你的UI線程和你的回調中都可以訪問的變量。

如果您正在考慮這一點,因爲您不希望回調在UI線程繁忙時消耗CPU週期,請記住,時下幾乎所有機器都至少有兩個CPU內核。這個問題不需要修正。

+0

謝謝,我想確保我的回調函數不會影響UI響應。 – 2010-10-05 17:56:27

0

WRT:// using timer queues because i dont have access to a hWnd in this class.

你並不需要通過一個hWnd SetTimer的來 - 你可以註冊一個計時器PROC那個叫回來。 WM_TIMER消息的優先級較低,只有在沒有其他消息處於待處理狀態時才由消息隊列生成,因此您可以自動獲取所需的行爲。

如果計時器消息正在進行繪圖,那麼很多設備驅動程序爭用串行化線程池的潛力很大,但多核CPU是常態,在工作線程中執行計時器處理不必完全乾擾UI線程。