WaitForMultipleObjects 関数 (synchapi.h)
指定したオブジェクトの 1 つ以上がシグナル状態であるか、タイムアウト間隔が経過するまで待機します。
アラート可能な待機状態を入力するには、 WaitForMultipleObjectsEx 関数を 使用します。
構文
DWORD WaitForMultipleObjects(
[in] DWORD nCount,
[in] const HANDLE *lpHandles,
[in] BOOL bWaitAll,
[in] DWORD dwMilliseconds
);
パラメーター
[in] nCount
lpHandles が指す配列内のオブジェクト ハンドルの数。 オブジェクト ハンドルの最大数は MAXIMUM_WAIT_OBJECTS。 このパラメーターを 0 にすることはできません。
[in] lpHandles
オブジェクト ハンドルの配列。 ハンドルを指定できるオブジェクトの種類の一覧については、次の「解説」セクションを参照してください。 配列には、さまざまな型のオブジェクトへのハンドルを含めることができます。 同じハンドルの複数のコピーが含まれていない場合があります。
待機がまだ保留中の間にこれらのハンドルの 1 つが閉じている場合、関数の動作は未定義です。
ハンドルには SYNCHRONIZE アクセス権が必要です。 詳細については、「 Standard Access Rights」を参照してください。
[in] bWaitAll
このパラメーターが TRUE の場合、 lpHandles 配列内のすべてのオブジェクトの状態がシグナル通知されると、 関数は を返します。 FALSE の場合、いずれかのオブジェクトの状態が signaled に設定されると、関数は を返します。 後者の場合、戻り値は、関数が戻る原因となった状態のオブジェクトを示します。
[in] dwMilliseconds
タイムアウト間隔 (ミリ秒単位)。 0 以外の値を指定した場合、関数は、指定したオブジェクトがシグナル通知されるか、間隔が経過するまで待機します。 dwMilliseconds が 0 の場合、指定したオブジェクトがシグナル通知されない場合、関数は待機状態になりません。常にすぐに返されます。 dwMilliseconds が INFINITE の場合、関数は、指定されたオブジェクトがシグナル通知された場合にのみを返します。
Windows XP、Windows Server 2003、Windows Vista、Windows 7、Windows Server 2008、Windows Server 2008 R2: dwMilliseconds 値には低電力状態で経過した時間も含まれます。 たとえば、コンピューターがスリープ状態の間もタイムアウトのカウント ダウンは継続されます。
Windows 8、Windows Server 2012、Windows 8.1、Windows Server 2012 R2、Windows 10、Windows Server 2016: dwMilliseconds 値には低電力状態で経過した時間は含まれません。 たとえば、コンピューターがスリープ状態の間、タイムアウトのカウント ダウンは継続されません。
戻り値
関数が成功した場合、戻り値は関数が戻る原因となったイベントを示します。 次のいずれかの値を指定できます。 ( WAIT_OBJECT_0 は 0 として定義され、 WAIT_ABANDONED_0 は 0x00000080L として定義されていることに注意してください)。
リターン コード/値 | Description |
---|---|
|
bWaitAll が TRUE の場合、指定した範囲内の戻り値は、指定されたすべてのオブジェクトの状態がシグナル通知されることを示します。
bWaitAll が FALSE の場合、戻り値から WAIT_OBJECT_0 を引いた値は、待機を満たすオブジェクトの lpHandles 配列インデックスを示します。 呼び出し中に複数のオブジェクトがシグナル化された場合、これはシグナルオブジェクトの配列インデックスであり、すべてのシグナルオブジェクトの最小インデックス値を持ちます。 |
|
bWaitAll が TRUE の場合、指定した範囲内の戻り値は、指定されたすべてのオブジェクトの状態がシグナル通知され、少なくとも 1 つのオブジェクトが破棄されたミューテックス オブジェクトであることを示します。
bWaitAll が FALSE の場合、戻り値から WAIT_ABANDONED_0 を引いた値は、待機を満たす破棄されたミューテックス オブジェクトの lpHandles 配列インデックスを示します。 ミューテックス オブジェクトの所有権は呼び出し元のスレッドに付与され、ミューテックスは非署名に設定されます。 ミューテックスが永続的な状態情報を保護していた場合は、整合性のためにチェックする必要があります。 |
|
タイムアウト間隔が経過し、 bWaitAll パラメーターで指定された条件が満たされていません。 |
|
関数が失敗しました。 詳細なエラー情報を得るには、GetLastError を呼び出します。 |
解説
WaitForMultipleObjects 関数は、待機条件が満たされているかどうかを判断します。 条件が満たされていない場合、呼び出し元のスレッドは、待機条件の条件が満たされるか、タイムアウト間隔が経過するまで待機状態になります。
bWaitAll が TRUE の場合、関数の待機操作は、すべてのオブジェクトの状態が signaled に設定されている場合にのみ完了します。 関数は、すべてのオブジェクトの状態が signaled に設定されるまで、指定されたオブジェクトの状態を変更しません。 たとえば、ミューテックスをシグナル化することはできますが、他のオブジェクトの状態も signaled に設定されるまで、スレッドは所有権を取得しません。 それまでは、他のスレッドがミューテックスの所有権を取得し、その状態を非署名に設定する場合があります。
bWaitAll が FALSE の場合、この関数は、オブジェクトの 1 つがシグナル通知されるまで、インデックス 0 から始まる順序で配列内のハンドルをチェックします。 複数のオブジェクトがシグナル通知された場合、関数はオブジェクトがシグナル化された配列内の最初のハンドルのインデックスを返します。
関数は、一部の種類の同期オブジェクトの状態を変更します。 変更は、シグナル状態によって関数が返されたオブジェクトに対してのみ行われます。 たとえば、セマフォ オブジェクトの数は 1 ずつ減少します。 詳細については、個々の同期オブジェクトのドキュメントを参照してください。
複数のMAXIMUM_WAIT_OBJECTSハンドルを待機するには、次のいずれかの方法を使用します。
- MAXIMUM_WAIT_OBJECTSハンドルを待機するスレッド を 作成し、そのスレッドと他のハンドルで待機します。 ハンドルを MAXIMUM_WAIT_OBJECTSのグループに分割するには、この手法を使用します。
- RegisterWaitForSingleObject または SetThreadpoolWait を呼び出して、各ハンドルを待機します。 スレッド プールはハンドルで効率的に待機し、オブジェクトがシグナル通知されるか、タイムアウト間隔の有効期限が切れた後にワーカー スレッドを割り当てます。
- 変更通知
- コンソール入力
- イベント
- メモリ リソース通知
- Mutex
- Process
- Semaphore
- スレッド
- 待機可能タイマー
例
例については、「 複数のオブジェクトの待機」を参照してください。
要件
要件 | 値 |
---|---|
サポートされている最小のクライアント | Windows XP [デスクトップ アプリ | UWP アプリ] |
サポートされている最小のサーバー | Windows Server 2003 [デスクトップ アプリのみ | UWP アプリ] |
対象プラットフォーム | Windows |
ヘッダー | synchapi.h (Windows.h を含む) |
Library | Kernel32.lib |
[DLL] | Kernel32.dll |