我在我的應用程序中有一個TTimer,每2秒觸發一次並調用我的事件處理程序HandleTimerEvent()。 HandleTimerEvent()函數修改共享資源,並且在返回之前可能需要10秒才能執行。此外,我在事件處理程序中調用Sleep()以便有時放棄處理器。TTimer.OnTimer事件處理程序是否可重入?
我不確定C++ builder的TTimer對象在調用事件時是如何工作的,所以我剛剛解釋的場景讓我想到了,特別是在事先調用返回之前是否調用HandleTimerEvent()。
這個問題歸結爲幾件事情。
TTimer對象是否排隊事件?
在先前調用返回之前,TTimer對象可以調用我的事件處理程序嗎?
+1用於禁用定時器。爲了演示禁用定時器的有效性(或簡單演示如果不這樣做會出錯),請在定時器處理程序中顯示一個消息框。如果您在進入時不禁用定時器,則消息框將疊加起來。 – 2010-07-22 18:26:44
您也可以使用布爾標誌來防止定時器事件處理程序中的重入,但禁用定時器本身要簡單得多。 – dthorpe 2010-07-22 21:23:21
請參閱https://forums.embarcadero.com/thread.jspa?messageID=171751𩻧以獲取有用的TTimerGuard類,TTimer使用的RAII風格類。可能需要根據您的實施情況調整FInterval使用情況。 – 2011-01-27 17:04:50