WaitForSingleObject函數用法

來源:互聯網
上載者:User

 

  等待函數可使線程自願進入等待狀態,直到一個特定的核心對象變為已通知狀態為止。這些等待函數中最常用的是WaitForSingleObject:

  DWORD WaitForSingleObject(HANDLE hObject, DWORD dwMilliseconds);

當線程調用該函數時,第一個參數hObject標識一個能夠支援被通知/未通知的核心對象。第二個參數dwMilliseconds.允許該線程指明,為了等待該對象變為已通知狀態,它將等待多長時間。調用下面這個函數將告訴系統,調用函數準備等待到h P r o c e s s控制代碼標識的進程終止運行為止:

 

WaitForSingleObject(hProcess, INFINITE);

第二個參數告訴系統,調用線程願意永遠等待下去(無限時間量),直到該進程終止運行。

通常情況下, I N F I N I T E是作為第二個參數傳遞給Wa i t F o r S i n g l e O b j e c t的,不過也可以傳遞任何一個值(以毫秒計算)。順便說一下, I N F I N I T E已經定義為0 x F F F F F F F F(或-1)。當然,傳遞I N F I N I T E有些危險。如果對象永遠不變為已通知狀態,那麼調用線程永遠不會被喚醒,它將永遠處於死結狀態,

不過,它不會浪費寶貴的C P U時間。

下面是如何用一個逾時值而不是I N F I N I T E來調用Wa i t F o r S i n g l e O b j e c t的例子:

DWORD dw = WaitForSingleObject(hProcess, 5000);

switch(dw)

{

   case WAIT_OBJECT_0:

      // The process terminated.

      break;

 

   case WAIT_TIMEOUT:

      // The process did not terminate within 5000 milliseconds.

      break;

 

   case WAIT_FAILED:

      // Bad call to function (invalid handle?)

      break;

}

上面這個代碼告訴系統,在特定的進程終止運行之前,或者在5 0 0 0 m s時間結束之前,調用線程不應該變為可調度狀態。因此,如果進程終止運行,那麼這個

 

函數調用將在不到5 0 0 0 m s的時間內返回,如果進程尚未終止運行,那麼它在大約5 0 0 0 m s時間內返回。注意,不能為d w M i l l i s e c o n d傳遞0。如果傳遞了0

 

,Wa i t F o r S i n g l e O b j e c t函數將總是立即返回。

Wa i t F o r S i n g l e O b j e c t的傳回值能夠指明調用線程為什麼再次變為可調度狀態。如果線程等待的對象變為已通知狀態,那麼傳回值是WA I T _ O B J E C T _ 0

 

。如果設定的逾時已經到期,則傳回值是WA I T _ T I M E O U T。如果將一個錯誤的值(如一個無效控制代碼)傳遞給Wa i t F o r S i n g l eO b j e c t,那麼傳回值將是WA I 

 

T _ FA I L E D(若要瞭解詳細資料,可調用G e t L a s t E r r o r)。

 

下面這個函數Wa i t F o r M u l t i p l e O b j e c t s與Wa i t F o r S i n g l e O b j e c t函數很相似,區別在於它允許調用線程同時查看若干個核心對象的已通知狀態:

 

 

DWORD WaitForMultipleObjects(DWORD dwCount,

   CONST HANDLE* phObjects, 

   BOOL fWaitAll, 

   DWORD dwMilliseconds);

d w C o u n t參數用於指明想要讓函數查看的核心對象的數量。這個值必須在1與M A X I M U M _WA I T _ O B J E C T S(在Wi n d o w s標頭檔中定義為6 4)之間。p h O 

 

b j e c t s參數是指向核心物件控點的數組的指標。

可以以兩種不同的方式來使用Wa i t F o r M u l t i p l e O b j e c t s函數。一種方式是讓線程進入等待狀態,直到指定核心對象中的任何一個變為已通知狀態。另一種

 

方式是讓線程進入等待狀態,直到所有指定的核心對象都變為已通知狀態。f Wa i tAl l參數告訴該函數,你想要讓它使用何種方式。如果為該參數傳遞T R U E,那

 

麼在所有對象變為已通知狀態之前,該函數將不允許調用線程運行。

 

d w M i l l i s e c o n d s參數的作用與它在Wa i t F o r S i n g l e O b j e c t中的作用完全相同。如果在等待的時候規定的時間到了,那麼該函數無論如何都會返回。同樣

 

,通常為該參數傳遞I N F I N I T E,但是在編寫代碼時應該小心,以避免出現死結情況。

 

Wa i t F o r M u l t i p l e O b j e c t s函數的傳回值告訴調用線程,為什麼它會被重新調度。可能的傳回值是WA I T _ FA I L E D和WA I T _ T I M E O U T,這兩個值的作用

 

是很清楚的。如果為f Wa i tAl l參數傳遞T R U E,同時所有對象均變為已通知狀態,那麼傳回值是WA I T _ O B J E C T _ 0。如果為f Wa i t A l l傳遞FA L S E,那麼一旦

 

任何一個對象變為已通知狀態,該函數便返回。在這種情況下,你可能想要知道哪個對象變為已通知狀態。傳回值是WA I T _ O B J E C T _ 0與(WA I T _ O B J E C 

 

T _ 0 + d w C o u n t - 1)之間的一個值。換句話說,如果傳回值不是WA I T _ T I M E O U T,也不是WA I T _ FA I L E D,那麼應該從傳回值中減去WA I T _ O B J E C T _ 0

 

。產生的數字是作為第二個參數傳遞給Wa i t F o r M u l t i p l e O b j e c t s的控制代碼數組中的索引。該索引說明哪個對象變為已通知狀態。下面是說明這一情況的一些

 

範例程式碼:

 

 

HANDLE h[3];

h[0] = hProcess1;

h[1] = hProcess2;

h[2] = hProcess3;

DWORD dw = WaitForMultipleObjects(3, h, FALSE, 5000);

switch(dw) 

{

   case WAIT_FAILED:

      // Bad call to function (invalid handle?)

      break;

 

   case WAIT_TIMEOUT:

      // None of the objects became signaled within 5000 milliseconds.

      break;

 

   case WAIT_OBJECT_0 + 0:

      // The process identified by h[0] (hProcess1) terminated.

      break;

 

   case WAIT_OBJECT_0 + 1:

      // The process identified by h[1] (hProcess2) terminated.

      break;

 

   case WAIT_OBJECT_0 + 2:

      // The process identified by h[2] (hProcess3) terminated.

      break;

}

 

如果為f Wa i t A l l參數傳遞FA L S E,Wa i t F o r M u l t i p l e O b j e c t s就從索引0開始向上對控制代碼數組進行掃描,同時已通知的第一個對象終止等待狀態。這可能產

 

生一些你不希望有的結果。例如,通過將3個進程控制代碼傳遞給該函數,你的線程就會等待3個子進程終止運行。如果數組中索引為0的進程終止運行,Wa i t F o r M 

 

u l t i p l e O b j e c t s就會返回。這時該線程就可以做它需要的任何事情,然後迴圈反覆,等待另一個進程終止運行。如果該線程傳遞相同的3個控制代碼,該函數立即

 

再次返回WA I T _ O B J E C T _ 0。除非刪除已經收到通知的控制代碼,否則代碼就無法正確地運行。

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.