SleepEx 関数 (synchapi.h)
指定した条件が満たされるまで、現在のスレッドを中断します。 次のいずれかが発生すると、実行が再開されます。
- I/O 完了コールバック関数が呼び出されます。
- 非同期プロシージャ 呼び出し (APC) がスレッドにキューに入れられます。
- タイムアウト間隔が経過します。
構文
DWORD SleepEx(
[in] DWORD dwMilliseconds,
[in] BOOL bAlertable
);
パラメーター
[in] dwMilliseconds
実行を中断する時間間隔 (ミリ秒単位)。
値が 0 の場合、スレッドはタイム スライスの残りの部分を、実行する準備ができている他のスレッドに放棄します。 実行する準備ができているスレッドが他に存在しない場合、関数はすぐにを返し、スレッドは実行を続行します。Windows XP: 値が 0 の場合、スレッドはタイム スライスの残りの部分を、実行する準備ができている同じ優先度の他のスレッドに放棄します。 実行する準備ができている同じ優先度のスレッドが他に存在しない場合、関数はすぐにを返し、スレッドは実行を続行します。 この動作は、Windows Server 2003 以降で変更されました。
INFINITE の値は、中断がタイムアウトしないことを示します。
[in] bAlertable
このパラメーターが FALSE の場合、タイムアウト期間が経過するまで関数は戻りません。 I/O 完了コールバックが発生した場合、関数はすぐには返されず、I/O 完了関数は実行されません。 APC がスレッドにキューに登録されている場合、関数はすぐには返されず、APC 関数は実行されません。
パラメーターが TRUE で、この関数を呼び出したスレッドが拡張 I/O 関数 (ReadFileEx または WriteFileEx) を呼び出したのと同じスレッドである場合、関数はタイムアウト期間が経過したとき、または I/O 完了コールバック関数が発生したときに を返します。 I/O 完了コールバックが発生した場合は、I/O 完了関数が呼び出されます。 APC がスレッドにキューに登録されている場合 (QueueUserAPC)、タイムアウト期間が経過したとき、または APC 関数が呼び出されたときに、関数は を返します。
戻り値
指定した時間間隔の有効期限が切れた場合、戻り値は 0 です。
戻り 値は、 1 つ以上の I/O 完了コールバック関数が原因で関数が返された場合にWAIT_IO_COMPLETIONされます。 これは、 bAlertable が TRUE の場合、および SleepEx 関数を呼び出したスレッドが拡張 I/O 関数を呼び出したスレッドと同じ場合にのみ発生します。
解説
この関数により、スレッドはタイム スライスの残りの部分を放棄し、 dwMilliseconds の値に基づいて一定の間隔で実行できなくなります。 スリープ間隔が経過すると、スレッドを実行する準備が整います。 準備完了スレッドがすぐに実行されるとは限らないことに注意してください。 したがって、スレッドは、システムの "ティック" 頻度と他のプロセスからの負荷係数に基づいて、スリープ間隔が経過してから何らかの時間が経過するまで実行されません。 システム クロックは、一定のレートで "ティック" します。 スリープ間隔の精度を高めるには、 timeGetDevCaps 関数を呼び出して、サポートされている最小タイマー解像度と timeBeginPeriod 関数を調べて、タイマーの解像度を最小値に設定します。 timeBeginPeriod を呼び出すときは注意が必要です。頻繁な呼び出しは、システム クロック、システム電源の使用、スケジューラに大きな影響を与える可能性があります。 timeBeginPeriod を呼び出す場合は、アプリケーションの早い段階で 1 回呼び出し、アプリケーションの最後に timeEndPeriod 関数を呼び出してください。 0 ミリ秒を指定した場合、スレッドはタイム スライスの残りの部分を放棄しますが、準備は維持されます。 詳細については、「 スケジュールの優先順位」を参照してください。
この関数は 、ReadFileEx 関数または WriteFileEx 関数と共に使用して、I/O 操作が完了するまでスレッドを中断できます。 これらの関数は、I/O 操作が完了したときに実行される完了ルーチンを指定します。 完了ルーチンを実行するには、完了コールバック関数が発生したときに、I/O 関数を呼び出したスレッドが警告可能な待機状態である必要があります。 スレッドは、関数の bAlertable パラメーターを TRUE に設定して、SleepEx、MsgWaitForMultipleObjectsEx、WaitForSingleObjectEx、または WaitForMultipleObjectsEx を呼び出すことによって、アラート可能な待機状態になります。
次のシナリオで SleepEx を使用する場合は注意してください。
- ウィンドウを直接または間接的に作成するコード (DDE や COM CoInitialize など)。 スレッドがウィンドウを作成する場合は、メッセージを処理する必要があります。 メッセージ ブロードキャストは、システム内のすべてのウィンドウに送信されます。 無限遅延で SleepEx を使用するスレッドがある場合、システムはデッドロックします。
- コンカレンシー制御下にあるスレッド。 たとえば、I/O 完了ポートまたはスレッド プールでは、実行できる関連付けられているスレッドの数が制限されます。 スレッドの最大数が既に実行されている場合は、実行中のスレッドが完了するまで、関連付けられている追加のスレッドを実行できません。 スレッドが SleepEx を 0 の間隔で使用して、関連する追加のスレッドの 1 つが何らかの作業を完了するまで待機すると、プロセスがデッドロックする可能性があります。
Windows Phone 8.1: この関数は、Windows Phone 8.1 以降のWindows Phone ストア アプリでサポートされています。
Windows 8.1と Windows Server 2012 R2: この関数は、Windows 8.1、Windows Server 2012 R2 以降の Windows ストア アプリでサポートされています。
要件
サポートされている最小のクライアント | Windows XP [デスクトップ アプリ | UWP アプリ] |
サポートされている最小のサーバー | Windows Server 2003 [デスクトップ アプリのみ | UWP アプリ] |
対象プラットフォーム | Windows |
ヘッダー | synchapi.h (Windows Vista、Windows 7、Windows Server 2008 Windows Server 2008 R2 の Windows.h を含む) |
Library | Kernel32.lib;Windows Phone 8.1 の WindowsPhoneCore.lib |
[DLL] | Windows Phone 8.1 で KernelBase.dll。Kernel32.dll |