2008-10-30 40 views
2

從MSDN:復位定時器可等待

CancelWaitableTimer功能不改變定時器的信號狀態。它可以在計時器被設置爲信號狀態並取消優秀的APC之前停止計時器。因此,對定時器執行等待操作的線程將一直處於等待狀態,直到它們超時或定時器重新激活並且其狀態設置爲發送信號。 如果定時器已處於信號狀態,則它保持該狀態。

(重點煤礦)

所以:我如何設置了手動復位waitable計時器到無信號狀態,如果我不能叫CancelWaitableTimer? ResetEvent不適用於等待定時器(它會因ERROR_INVALID_HANDLE而失敗)。

我不想使用SetWaitableTimer,因爲(在這一點上)我不知道設置它的持續時間。我想我可以將延遲設置爲很大一部分,但這對我來說有點像黑客。

回答

2

你能用一些非常大的時間來調用SetWaitableTimer嗎?然後一旦知道實時,再打電話給它。

更新:不管有沒有文檔,文檔都很清楚,一個m-r等待定時器「保持在發信狀態直到SetWaitableTimer被調用」。在我看來,這是你將不得不使用的功能。你只需要有一個很好的常量叫做'RESET_TIMER',它被設置爲-2^63或者其他值。

+0

我可以,但是這是一個黑客攻擊的一位。 – 2008-10-30 18:22:43

0

如果您讓等待定時器自動復位,那麼只要等待該定時器完成,它就會自動復位。

然而,從MSDN:

如果多個對象變得發信號通知,該函數返回其對象被信號通知所述陣列中的第一手柄的索引。

我原本以爲,這意味着你可以失去一個定時器信號,如果等待陣列中的一個較早的手柄,同時作爲可等待計時器變成信號,但因爲我已經讀了

WaitForMultipleObjects()從0開始掃描句柄數組,並在找到一個有信號的句柄後立即返回。只有第一個找到的句柄被重置爲無信號狀態;其他人沒有受傷。

Behavior of WaitForMultipleObjects when multiple handles signal at the same time