SetWaitableTimer 関数 (synchapi.h)

指定された待機可能タイマーをアクティブにします。 期限が到着すると、タイマーが通知され、タイマーを設定したスレッドが省略可能な完了ルーチンを呼び出します。

構文

BOOL SetWaitableTimer(
  [in]           HANDLE              hTimer,
  [in]           const LARGE_INTEGER *lpDueTime,
  [in]           LONG                lPeriod,
  [in, optional] PTIMERAPCROUTINE    pfnCompletionRoutine,
  [in, optional] LPVOID              lpArgToCompletionRoutine,
  [in]           BOOL                fResume
);

パラメーター

[in] hTimer

タイマー オブジェクトのハンドル。 CreateWaitableTimer または OpenWaitableTimer 関数は、このハンドルを返します。

ハンドルには、TIMER_MODIFY_STATE アクセス権が必要です。 詳細については、「同期オブジェクトのセキュリティとアクセス権のを する」を参照してください。

[in] lpDueTime

タイマーの状態がシグナル通知に設定されるまでの時間 (100 ナノ秒間隔)。 FILETIME 構造体で記述されている形式を使用します。 正の値は絶対時間を示します。 システムでは内部的に UTC ベースの時刻が使用されるため、UTC ベースの絶対時間を使用してください。 負の値は相対時間を示します。 実際のタイマーの精度は、ハードウェアの機能によって異なります。 UTC ベースの時刻の詳細については、「システム時刻を する」を参照してください。

Windows XP、Windows Server 2003、Windows Vista、Windows 7、Windows Server 2008、Windows Server 2008 R2: 相対時間が指定されている場合、タイマーには低電力状態で費やされた時間が含まれます。 たとえば、タイマーは、コンピューターがスリープ状態の間もカウントダウンを続けます。

Windows 8 以降、Windows Server 2012 以降: 相対時間が指定されている場合、タイマーには低電力状態で費やされた時間は含まれません。 たとえば、タイマーは、コンピューターがスリープ状態の間、カウントダウンを続行しません。

[in] lPeriod

タイマーの期間 (ミリ秒単位)。 lPeriod が 0 の場合、タイマーは 1 回通知されます。 lPeriod が 0 より大きい場合、タイマーは定期的です。 定期的なタイマーは、CancelWaitableTimer 関数を使用してタイマーが取り消されるか、SetWaitableTimerを使用してリセットされるまで、期間が経過するたびに自動的 再アクティブ化します。 lPeriod が 0 未満の場合、関数は失敗します。

[in, optional] pfnCompletionRoutine

省略可能な完了ルーチンへのポインター。 完了ルーチンは、タイマーが通知されたときに実行される PTIMERAPCROUTINE 型のアプリケーション定義関数です。 タイマー コールバック関数の詳細については、「TimerAPCProcを参照してください。 APC とスレッド プール スレッドの詳細については、「解説」を参照してください。

[in, optional] lpArgToCompletionRoutine

完了ルーチンに渡される構造体へのポインター。

[in] fResume

このパラメーターが TRUE場合は、タイマーの状態がシグナル状態に設定されているときに、システムを一時停止電力節約モードで復元します。 それ以外の場合、システムは復元されません。 システムが復元をサポートしていない場合、呼び出しは成功しますが、GetLastError は ERROR_NOT_SUPPORTEDを返します。

戻り値

関数が成功した場合、戻り値は 0 以外です。

関数が失敗した場合、戻り値は 0 です。 拡張エラー情報を取得するには、GetLastError呼び出します。

備考

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

指定された期限が到着すると、タイマーは非アクティブになり、未処理の APC が既にキューに登録されていない場合は、タイマーを設定するスレッドにオプションの APC がキューに入れられます。 タイマーの状態はシグナル状態に設定され、タイマーは指定された期間を使用して再アクティブ化され、タイマーを設定したスレッドは警告可能な待機状態になると完了ルーチンを呼び出します。 詳細については、QueueUserAPCを参照してください。 システムがスレッド プール スレッドの有効期間を制御するため、通知が配信される前にスレッドが終了する可能性があるため、APC はスレッド プール スレッドの他のシグナリング メカニズムと同様に機能しないことに注意してください。 pfnCompletionRoutine パラメーターまたは別の APC ベースのシグナリング メカニズムを使用する代わりに、CreateThreadpoolTimerで作成されたタイマーなどの待機可能なオブジェクトを使用します。 I/O の場合は、CreateThreadpoolIo 使用して作成された I/O 完了オブジェクト、またはイベントを SetThreadpoolWait 関数に渡すことができる、OVERLAPPED 構造体に基づく hEventを使用します。

タイマーを設定したスレッドが終了し、関連する完了ルーチンがある場合、タイマーは取り消されます。 ただし、タイマーの状態は変更されません。 完了ルーチンがない場合、スレッドを終了してもタイマーには影響しません。

手動リセット タイマーがシグナル状態に設定されている場合、タイマーをリセットするために SetWaitableTimer 呼び出されるまで、この状態のままになります。 その結果、定期的な手動リセット タイマーは、最初の期限が到着したときに通知された状態に設定され、リセットされるまで通知されたままになります。 同期タイマーがシグナル状態に設定されると、スレッドがタイマー オブジェクトの待機操作を完了するまで、この状態のままになります。

システム時間を調整すると、未処理の絶対タイマーの期限が調整されます。

この関数を使用するアプリケーションをコンパイルするには、_WIN32_WINNT を 0x0400 以降として定義します。 詳細については、「Windows ヘッダーの使用」を参照してください。

タイマーを使用してウィンドウのイベントをスケジュールするには、SetTimer 関数を使用します。

タイマーを処理する API では、さまざまなハードウェア クロックが使用されます。 これらのクロックの解像度は、予想と大きく異なる場合があります。一部の解像度は、ナノ秒単位 (ACPI または TSC カウンターを使用する場合) にミリ秒単位で測定できます (RTC ベースのタイマー チップを使用する場合)。 timeBeginPeriod を呼び出し、timeEndPeriod 関数を することで、API の解決を変更できます。 解像度をどの程度正確に変更できるかは、特定の API で使用されるハードウェア クロックによって異なります。 詳細については、ハードウェアのドキュメントを参照してください。

例

SetWaitableTimer使用する例については、「待機可能タイマー オブジェクトを使用する 」を参照してください。

必要条件

要件 価値
サポートされる最小クライアント Windows XP [デスクトップ アプリ |UWP アプリ]
サポートされる最小サーバー Windows Server 2003 [デスクトップ アプリ |UWP アプリ]
ターゲット プラットフォーム の ウィンドウズ
ヘッダー synchapi.h (Windows Server 2003、Windows Vista、Windows 7、Windows Server 2008 Windows Server 2008 R2 の Windows.h を含む)
ライブラリ Kernel32.lib
DLL Kernel32.dll

関連項目

CancelWaitableTimer の

CreateWaitableTimer の

OpenWaitableTimer

同期関数の

TimerAPCProc

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