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