2012-02-29 66 views
2

說,我有以下的C++代碼。如何推遲一個可等待計時器無限期

首先我創建一個手動可等待定時器作爲這樣:

HANDLE hWTimer = CreateWaitableTimer(NULL, FALSE, NULL); 

然後它被設置爲一個預定義的時間在將來觸發一次(實際值由用戶輸入提供的):

double fSeconds2Wait = 10000; 

LARGE_INTEGER li; 
//Convert to 100 nanosecond intervals (MUST BE NEGATIVE) 
li.QuadPart = -10000000LL * (LONGLONG)fSeconds2Wait; 

SetWaitableTimer(hWTimer, &li, 0, NULL, NULL, 0); 

然後,我有駐留在一個等待狀態,等待計時器消防工作線程:

WaitForSingleObject(hWTimer, INFINITE); 

//Perform actions when timer fires 

我有,比方說,如果我要無限期推遲了「hWTimer」有可能稍後將其重置到另一個時間的問題(根據用戶要求),我該怎麼辦呢?

+1

從MSDN文檔(用簡單的谷歌搜索找到) - 定時器最初是無效的。要激活定時器,請調用SetWaitableTimer。如果定時器在調用SetWaitableTimer時已處於活動狀態,則定時器停止,然後重新激活。以這種方式停止定時器不會將定時器狀態設置爲發信號,因此在定時器的等待操作中被阻塞的線程將被阻塞。但是,它會取消任何未完成的完成例程。 – Dampsquid 2012-02-29 22:10:44

+0

@Dampsquid我很抱歉,但是這怎麼回答我的問題? – ahmd0 2012-02-29 22:13:24

+0

它說,你可以打電話的時候,它已經運行了SetWaitableTimer,並重新啓動它 – Dampsquid 2012-02-29 22:15:48

回答

0

從MSDN文檔

對於SetWaitableTimer

定時器最初不活動的。要激活定時器,請調用SetWaitableTimer。如果定時器在調用SetWaitableTimer時已處於活動狀態,則定時器停止,然後重新激活。以這種方式停止定時器不會將定時器狀態設置爲發信號,因此在定時器的等待操作中被阻塞的線程將被阻塞。但是,它會取消任何未完成的完成例程。

和對於CancelWaitableTimer

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

要重新計時,調用SetWaitableTimer功能。

所以從這個可以通過調用CancelWaitableTimer抱過你的計時器(和線程),並從用戶的請求,通過調用SetWaitableTimer重新啓動它。