タイマーの概要

このトピックでは、タイマーの作成、識別、設定、削除方法について説明します。 アプリケーションはタイマーを使って、指定した時間が経過した後にウィンドウのイベントをスケジュールします。 タイマーに指定した間隔 (またはタイムアウト値) が経過するたびに、タイマーに関連付けられたウィンドウにシステムから通知されます。 システム クロック レートと、アプリケーションがメッセージ キューからメッセージを取得する頻度によってタイマーの精度は変わるので、タイムアウト値はおおよその値にすぎません。

このトピックは次のセクションで構成されます。

タイマー操作

アプリケーションは SetTimer 関数を使ってタイマーを作成します。 新しいタイマーは、作成されるとすぐに間隔の計測を開始します。 アプリケーションは、SetTimer を使ってタイマーのタイムアウト値を変更できます。また、KillTimer 関数を使ってタイマーを破棄できます。 システム リソースを効率的に使うには、不要になったタイマーをアプリケーションで破棄する必要があります。

各タイマーには一意の識別子があります。 タイマーを作成するときに、アプリケーションで識別子を指定するか、システムに一意の値を作成させることができます。 WM_TIMER メッセージの最初のパラメーターには、メッセージを投稿したタイマーの識別子が含まれています。

SetTimer の呼び出しでウィンドウ ハンドルを指定すると、アプリケーションによってタイマーはそのウィンドウに関連付けられます。 タイマーのタイムアウト値が経過するたびに、システムはタイマーに関連付けられたウィンドウに WM_TIMER メッセージを投稿します。 SetTimer の呼び出しでウィンドウ ハンドルが指定されていない場合、タイマーを作成したアプリケーションは、メッセージ キューで WM_TIMER メッセージを監視し、それらを適切なウィンドウにディスパッチする必要があります。

Note

省略可能な TIMERPROC コールバック関数を指定すると、この関数はメッセージ ループの間で呼び出され、WM_TIMER は、WNDPROC コールバックにはディスパッチされません。

タイマーが経過したときに通知を受ける必要がある場合は、待機可能なタイマーを使います。 詳細については、「待機可能タイマー オブジェクト」を参照してください。

高分解能タイマー

カウンターとは、プログラミングで使われる、インクリメントする変数を指す一般的な用語です。 一部のシステムには、高分解能の経過時間を提供する高分解能パフォーマンス カウンターが含まれています。

システムに高分解能パフォーマンス カウンターが存在する場合は、QueryPerformanceFrequency 関数を使って頻度を 1 秒あたりのカウント数で表すことができます。 カウントの値はプロセッサに依存します。 たとえば、一部のプロセッサでは、カウントはプロセッサ クロックのサイクル レートである場合があります。

QueryPerformanceCounter 関数を使うと、高分解能パフォーマンス カウンターの現在の値を取得できます。 コードのセクションの先頭と末尾でこの関数を呼び出すことによって、アプリケーションは基本的にカウンターを高解像度タイマーとして使います。 たとえば、QueryPerformanceFrequency を使って高分解能パフォーマンス カウンターの周波数を 50,000 カウント/秒と指定したとします。 アプリケーションで、時間を測定するコード セクションの直前と直後に QueryPerformanceCounter を呼び出す場合、カウンター値はそれぞれ 1500 カウントと 3500 カウントになる可能性があります。 これらの値は、コードの実行中に 0.04 秒 (2000 カウント) が経過したことを示します。

待機可能タイマー オブジェクト

待機可能タイマー オブジェクトは、指定した期限になると状態が通知済みに設定される同期オブジェクトです。 作成できる待機可能タイマーには、手動リセットと同期の 2 種類があります。 どちらの種類のタイマーも定期的なタイマーにすることができます。

スレッドは、CreateWaitableTimer または CreateWaitableTimerEx 関数を使ってタイマー オブジェクトを作成します。 作成するスレッドには、タイマーが手動リセット タイマーであるか同期タイマーであるかを指定します。 作成するスレッドにはタイマー オブジェクトの名前を指定できます。 他のプロセスのスレッドは、OpenWaitableTimer 関数の呼び出しで名前を指定することで、既存のタイマーへのハンドルを開くことができます。 タイマー オブジェクトへのハンドルを持つスレッドは、いずれかの待機関数を使って、タイマー状態が通知済みに設定されるのを待つことができます。

スレッド同期に待機可能タイマー オブジェクトを使う方法の詳細については、「待機可能タイマー オブジェクト」を参照してください。