15.[個人]C++線程入門到進階(15)----線程函數:WaitForSingleObject

等待函數可使線程自願進入等待狀態,直到一個特定的內核對象變爲已通知狀態爲止。

 

WaitForSingleObject 函數

DWORD WaitForSingleObject(

HANDLE hObject,

     DWORD dwMilliseconds

);

第一個參數hObject標識一個能夠支持被通知/未通知的內核對象(前面列出的任何一種對象都適用)。

第二個參數dwMilliseconds允許該線程指明,爲了等待該對象變爲已通知狀態,它將等待多長時間。(INFINITE無限時間量,INFINITE已經定義爲0xFFFFFFFF(或-1))

傳遞INFINITE有些危險如果對象永遠變爲已通知狀態,那麼調用線程永遠不會被喚醒,它將永遠處於死鎖狀態,不過,它不會浪費寶貴的C P U時間。

 

例子:

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;

}

上面這個代碼告訴系統,在特定的進程(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參數用於指明想要讓函數查看的內核對象的數量。這個值必須1MAXIMU M_WAIT_OBJECTS(在Windows頭文件中定義爲64)之間。

phObjects參數是指向內核對象句柄的數組的指針。

 

可以以兩種不同的方式來使用WaitForMultipleObjects函數

一種方式是讓線程進入等待狀態,直到指定內核對象中的任何一個變爲已通知狀態。

另一種方式是讓線程進入等待狀態,直到所有指定的內核對象都變爲已通知狀態。

fWaitAll參數告訴該函數,你想要讓它使用何種方式。如果爲該參數傳遞TRUE,那麼在所有對象變爲已通知狀態之前,該函數將不允許調用線程運行。

dwMilliseconds參數的作用與它在WaitForSingleObject中的作用完全相同。如果在等待的時候規定的時間到了,那麼該函數無論如何都會返回。。

WaitForMultipleObjects函數的返回值告訴調用線程,爲什麼它會被重新調度。可能的返回值是WAIT_FAILEDWAIT_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)

{

   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;

}

發佈了51 篇原創文章 · 獲贊 149 · 訪問量 31萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章