WaitForMultipleObjects 函式 (synchapi.h)
等候一或所有指定的對象處於訊號狀態或逾時間隔經過為止。
若要進入可警示的等候狀態,請使用 WaitForMultipleObjectsEx 函式。
語法
DWORD WaitForMultipleObjects(
[in] DWORD nCount,
[in] const HANDLE *lpHandles,
[in] BOOL bWaitAll,
[in] DWORD dwMilliseconds
);
參數
[in] nCount
lpHandles 所指向數位中的物件句柄數目。 物件句柄數目上限 為MAXIMUM_WAIT_OBJECTS。 此參數不可為零。
[in] lpHandles
物件句柄的陣列。 如需可指定句柄的物件類型清單,請參閱下列一節。 數位可以包含不同類型物件的句柄。 它可能不會包含相同句柄的多個複本。
如果等候仍在擱置時關閉其中一個句柄,則函式的行為未定義。
句柄必須具有 SYNCHRONIZE 存取權。 如需詳細資訊,請參閱 標準訪問許可權。
[in] bWaitAll
勾選此參數為 TRUE,則當 lpHandles 陣列中所有物件的狀態發出訊號時,函式會傳回 。 如果 為 FALSE,則函式會在任一物件的狀態設定為已發出訊號時傳回。 在後者的情況下,傳回值會指出造成函式傳回其狀態的物件。
[in] dwMilliseconds
逾時間隔,以毫秒為單位。 如果指定了非零值,函式會等到指定的物件收到訊號或間隔經過為止。 如果 dwMilliseconds 為零,如果指定的物件未發出訊號,函式就不會進入等候狀態;它一律會立即傳回。 如果 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,則指定範圍內的傳回值表示所有指定物件的狀態都會發出訊號,而且至少有一個物件是已放棄的 mutex 物件。
如果 bWaitAll 為 FALSE,則傳回值減 去 WAIT_ABANDONED_0 表示已放棄 mutex 物件的 lpHandles 陣列索引,滿足等候。 Mutex 對象的擁有權會授與呼叫線程,且 mutex 會設定為非簽署。 如果 Mutex 正在保護持續性狀態資訊,您應該檢查其是否一致性。 |
|
未滿足 bWaitAll 參數所指定的逾時間隔和條件。 |
|
函式失敗。 若要取得擴充的錯誤資訊,請呼叫 GetLastError。 |
備註
WaitForMultipleObjects 函式會判斷是否已符合等候準則。 如果不符合準則,則呼叫線程會進入等候狀態,直到符合等候準則的條件或逾時間隔經過為止。
當 bWaitAll 為 TRUE 時,函式的等候作業只會在所有物件的狀態設定為已發出訊號時完成。 函式不會修改指定物件的狀態,直到所有物件的狀態都設定為已發出訊號為止。 例如,可以發出 mutex 的訊號,但線程在其他物件的狀態也設定為已發出訊號之前,不會取得擁有權。 同時,某些其他線程可能會取得 mutex 的擁有權,因此將其狀態設定為非簽署狀態。
當 bWaitAll 為 FALSE 時,此函式會檢查數位列中的句柄,從索引 0 開始,直到發出其中一個物件的訊號為止。 如果多個物件收到訊號,函式會傳回數位中對象已發出訊號的第一個句柄索引。
函式會修改某些同步處理物件類型的狀態。 修改只會針對發出訊號狀態導致函式傳回的物件或物件進行修改。 例如,旗號物件的計數會減少一個。 如需詳細資訊,請參閱個別同步處理對象的檔。
若要等候多個 MAXIMUM_WAIT_OBJECTS 句柄,請使用下列其中一種方法:
- 建立線程以等候 MAXIMUM_WAIT_OBJECTS 句柄,然後等候該線程加上其他句柄。 使用此技術將句柄分成 MAXIMUM_WAIT_OBJECTS群組。
- 呼叫 RegisterWaitForSingleObject 或 SetThreadpoolWait 以等候每個句柄。 線程集區會在句柄上有效率地等候,並在對象發出訊號或逾時間隔到期之後指派背景工作線程。
- 變更通知
- 主控台輸入
- 事件
- 記憶體資源通知
- Mutex
- 流程
- Semaphore
- 執行緒
- 可等候的定時器
範例
如需範例,請參閱 等候多個物件。
規格需求
需求 | 值 |
---|---|
最低支援的用戶端 | Windows XP [傳統型應用程式 |UWP 應用程式] |
最低支援的伺服器 | Windows Server 2003 [傳統型應用程式 |UWP 應用程式] |
目標平台 | Windows |
標頭 | synchapi.h (包含 Windows.h) |
程式庫 | Kernel32.lib |
DLL | Kernel32.dll |