串列埠之WaitForSingleObjec、WaitForMultipleObjects函式詳解
WaitForSingleObject函式
等待函式可使執行緒自願進入等待狀態,直到一個特定的核心物件變為已通知狀態為止。
DWORD WaitForSingleObject(
HANDLE hObject,
DWORD dwMilliseconds
);
第一個引數hObject標識一個能夠支援被通知/未通知的核心物件(前面列出的任何一種物件都適用)。
第二個引數dwMilliseconds允許該執行緒指明,為了等待該物件變為已通知狀態,它將等待多長時間。(INFINITE為無限時間量,INFINITE已經定義為0xFFFFFFFF(或-1))
傳遞INFINITE有些危險
WaitForMultipleObjects函式
WaitForMultipleObjects函式與WaitForSingleObject函式很相似,區別在於它允許呼叫執行緒同時檢視若干個核心物件的已通知狀態:
DWORD WaitForMultipleObjects(
DWORD dwCount,
CONST HANDLE* phObjects,
BOOL fWaitAll,
DWORD dwMilliseconds
);
dwCount
phObjects引數是指向核心物件控制代碼的陣列的指標。
可以以兩種不同的方式來使用WaitForMultipleObjects函式。
一種方式是讓執行緒進入等待狀態,直到指定核心物件中的任何一個變為已通知狀態。
另一種方式是讓執行緒進入等待狀態,直到所有指定的核心物件都變為已通知狀態。
fWaitAll引數告訴該函式,你想要讓它使用何種方式。如果為該引數傳遞TRUE,那麼在所有物件變為已通知狀態之前,該函式將不允許呼叫執行緒執行。
dwMilliseconds引數的作用與它在WaitForSingleObject中的作用完全相同。如果在等待的時候規定的時間到了,那麼該函式無論如何都會返回。。
WaitForMultipleObjects函式的返回值告訴呼叫執行緒,為什麼它會被重新排程。可能的返回值是WAIT_FAILED和WAIT_TIMEOUT。如果為fWaitAl l引數傳遞TRUE,同時所有物件均變為已通知狀態,那麼返回值是WAIT_OBJECT_0。如果為fWaitAll傳遞FALSE,那麼一旦任何一個物件變為已通知狀態,該函式便返回。在這種情況下,你可能想要知道哪個物件變為已通知狀態。返回值是WAIT_OBJECT_0與(WAIT_OJECT_0 + dwCount-1)之間的一個值。換句話說,如果返回值不是WAIT_TIMEOUT,也不是WAIT_FAILED,那麼應該從返回值中減去WAIT_OBJECT_0。產生的數字是作為第二個引數傳遞給WaitForMultipleObjects的控制代碼陣列中的索引。該索引說明哪個物件變為已通知狀態。