等待函式可使執行緒自願進入等待狀態,直到乙個特定的核心物件變為已通知狀態為止。
waitforsingleobject
函式
dword waitforsingleobject(
handle hobject,
dword dwmilliseconds);
第乙個引數hobject標識乙個能夠支援被通知/未通知的核心物件(前面列出的任何一種物件都適用)。
第二個引數
dwmilliseconds
允許該執行緒指明,為了等待該物件變為已通知狀態,它將等待多長時間。(
infinite
為無限時間量,infinite已經定義為0xffffffff(或-1)) 傳遞
infinite
有些危險
。如果物件永遠不變為已通知狀態,那麼呼叫執行緒永遠不會被喚醒,它將永遠處於死鎖狀態,不過,它不會浪費寶貴的
c p u
時間。
例子:
dword dw = waitforsingleobject(hprocess, 5000);
switch(
dw)
上面這個**告訴系統,在特定的程序(
hprocess
)終止執行(程序
hprocess
終止執行變成已經通知
)之前,或者在5000m s時間結束之前,呼叫執行緒不應該變為可排程狀態。
waitforsingleobject
的返回值能夠指明呼叫執行緒為什麼再次變為可排程狀態。
如果執行緒等待的物件變為已通知狀態,那麼返回值是
wait_object_0。
如果設定的超時已經到期,則返回值是
wait_timeout。
如果將乙個錯誤的值(如乙個無效控制代碼)傳遞給waitforsingleobject,那麼返回值將是
wait_failed
(若要了解詳細資訊,可呼叫getlasterror)。
waitformultipleobjects
函式
waitformultipleobjects函式與waitforsingleobject函式很相似,區別在於它允許呼叫執行緒同時檢視若干個核心物件的已通知狀態:
dword waitformultipleobjects(
dword dwcount,
const handle* phobjects,
bool fwaitall,
dword dwmilliseconds
);dwcount
引數用於指明想要讓函式檢視的核心物件的數量。這個值必須在1與maximu m_wait_objects(在windows標頭檔案中定義為64)之間。
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的控制代碼陣列中的索引。該索引說明哪個物件變為已通知狀態。
下面是說明這一情況的一些示例**
handle h[3];
h[0] = hprocess1;
h[1] = hprocess2;
h[2] = hprocess3;
dword dw = waitformultipleobjects(3, h, false, 5000);
switch(dw)
**
WaitForSingleObject的通俗講解!
用最簡單的語言說就是這個物件有兩個狀態比如我們稱0和1,稱什麼一點也不重要,有訊號和無訊號就是相對的兩個狀態,沒什麼意義,你就認為乙個狀態是0另乙個狀態是1。在程式裡如果加了waitforsingleobject,那麼程式到這裡就去檢測你給他的那個控制代碼的狀態,如果是0程式就停在這裡了,如果是1,...
WaitForSingleObject的詳細用法
在多執行緒的情況下,有時候我們會希望等待某一線程完成了再繼續做其他事情,要實現這個目的,可以使用windows api函式waitforsingleobject,或者waitformultipleobjects。這兩個函式都會等待object被標為有訊號 signaled 時才返回的。那麼,訊號是什...
WaitForSingleObject的詳細用法
使用者模式的執行緒同步機制效率高,如果需要考慮執行緒同步問題,應該首先考慮使用者模式的執行緒同步方法。但是,使用者模式的執行緒同步有限制,對於多個程序之間的執行緒同步,使用者模式的執行緒同步方法無能為力。這時,只能考慮使用核心模式。windows提供了許多核心物件來實現執行緒的同步。對於執行緒同步而...