2012-02-29 23 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」を後で(ユーザーの要求に応じて)別の時間にリセットする可能性をもって無期限に保留したい場合、どうすればいいですか? SetWaitableTimer

タイマーのMSDNドキュメント

から

+1

MSDN Docs(シンプルなGoogle検索で見つかる) - タイマーは、最初は非アクティブです。タイマーをアクティブにするには、SetWaitableTimerを呼び出します。 SetWaitableTimerを呼び出すときにタイマーが既にアクティブな場合、タイマーは停止してから再びアクティブになります。この方法でタイマーを停止しても、タイマー状態は通知されません。したがって、タイマーの待機操作でブロックされたスレッドはブロックされたままです。ただし、保留中の完了ルーチンは取り消されます。 – Dampsquid

+0

@Dampsquid申し訳ありませんが、私の質問にどう答えますか? – ahmd0

+0

それはあなたがそのが既に実行中SetWaitableTimerを呼び出すことができますし、それを再起動し – Dampsquid

答えて

0

は、最初は非アクティブです。タイマーをアクティブにするには、SetWaitableTimerを呼び出します。 SetWaitableTimerを呼び出すときにタイマーが既にアクティブな場合、タイマーは停止してから再びアクティブになります。この方法でタイマーを停止しても、タイマー状態は通知されません。したがって、タイマーの待機操作でブロックされたスレッドはブロックされたままです。ただし、保留中の完了ルーチンは取り消されます。

とCancelWaitableTimer

CancelWaitableTimer機能については

は、タイマーのシグナル状態を変更しません。タイマーを停止してシグナル状態にし、未処理のAPCをキャンセルします。したがって、タイマーで待機操作を実行するスレッドは、タイムアウトするか、タイマーが再起動され、その状態が通知されるまで待機します。タイマーがすでに信号状態にある場合、タイマーはその状態のままである。

タイマーを再度有効にするには、SetWaitableTimer関数を呼び出します。

だからこれからあなたがCancelWaitableTimerを呼び出すことによって、あなたのタイマー(スレッド)をオフに保持し、利用者からの要求に応じて、SetWaitableTimerを呼び出すことによって、それを再起動することができます。

関連する問題