待機可能タイマー オブジェクト
待機可能タイマー オブジェクト は、指定された期限が到着したときに状態がシグナル通知に設定される同期オブジェクトです。 作成できる待機可能タイマーには、手動リセットと同期の 2 種類があります。 どちらの種類のタイマーも、定期的なタイマーにすることができます。
手記
タイマーが通知されると、関連する命令を処理するためにプロセッサを実行する必要があります。 高周波の定期的なタイマーはプロセッサを継続的にビジー状態に保つため、システムが意味のある時間 低い 電源状態に留まるのを防ぎます。 これは、ポータブル コンピューターのバッテリ寿命や、大規模なデータセンターなどの効果的な電源管理に依存するシナリオに悪影響を及ぼす可能性があります。 エネルギー効率を向上するには、アプリケーションで時間ベースの通知ではなく、イベントベースの通知を使用することを検討してください。 タイマーが必要な場合は、定期的なタイマーではなく 1 回通知されるタイマーを使用するか、間隔を 1 秒より大きい値に設定します。
スレッドは、createWaitableTimerを使用するか、CreateWaitableTimerEx関数をしてタイマー オブジェクトを作成します。 作成スレッドは、タイマーが手動リセット タイマーか同期タイマーかを指定します。 作成スレッドでは、タイマー オブジェクトの名前を指定できます。 他のプロセスのスレッドは、OpenWaitableTimer 関数の呼び出しで名前を指定することで、既存のタイマーへのハンドルを開くことができます。 タイマー オブジェクトへのハンドルを持つスレッドは、タイマー状態がシグナル状態に設定されるのを待つ 待機関数のいずれかを使用できます。
- スレッドは SetWaitableTimer 関数を呼び出してタイマーをアクティブ化します。 SetWaitableTimer 次のパラメーターの使用に注意してください。
- lpDueTime パラメーターを使用して、タイマーをシグナル状態に設定する時刻を指定します。 手動リセット タイマーがシグナル状態に設定されている場合、SetWaitableTimer 新しい期限が確立されるまで、この状態のままになります。 同期タイマーがシグナル状態に設定されると、スレッドがタイマー オブジェクトの待機操作を完了するまで、この状態のままになります。
- タイマー期間を指定するには、SetWaitableTimer 関数の lPeriod パラメーターを使用します。 期間が 0 でない場合、タイマーは定期的なタイマーです。タイマーがリセットまたは取り消されるまで、期間の有効期限が切れるたびに再アクティブ化されます。 期間が 0 の場合、タイマーは定期的なタイマーではありません。1 回通知された後、非アクティブ化されます。
スレッドは、CancelWaitableTimer 関数を使用して、タイマーを非アクティブ状態に設定できます。 タイマーをリセットするには、SetWaitableTimer呼び出します。 タイマー オブジェクトが終了したら、CloseHandle を呼び出して、タイマー オブジェクトへのハンドルを閉じます。
待機可能タイマーの動作は、次のように要約できます。
- タイマーが設定されると、既にアクティブであった場合は取り消され、タイマーの状態は割り当て解除され、タイマーはカーネル タイマー キューに配置されます。
- タイマーの有効期限が切れると、タイマーはシグナル状態に設定されます。 タイマーに完了ルーチンがある場合は、タイマーを設定したスレッドにキューに入れられます。 完了ルーチンは、スレッドが警告可能な待機状態になるまで、スレッドの 非同期プロシージャ呼び出し (APC) キューに残ります。 その時点で、APC がディスパッチされ、完了ルーチンが呼び出されます。 タイマーが定期的な場合は、カーネル タイマー キューに戻されます。
- タイマーが取り消されると、保留中の場合はカーネル タイマー キューから削除されます。 タイマーの有効期限が切れており、タイマーを設定するスレッドに APC キューが残っている場合、APC はスレッドの APC キューから削除されます。 タイマーのシグナル状態は影響を受けません。
関連トピック