1. 程式人生 > >c++執行緒學習5等待函式

c++執行緒學習5等待函式

WaitForSingleObject的用法  


WaitForSingleObject的用法
DWORD WaitForSingleObject(

  HANDLE hHandle,

  DWORD dwMilliseconds

);


引數hHandle是一個事件的控制代碼,第二個引數dwMilliseconds是時間間隔。如果時間是有訊號狀態返回WAIT_OBJECT_0,如果時間超過dwMilliseconds值但時間事件還是無訊號狀態則返回WAIT_TIMEOUT。

hHandle可以是下列物件的控制代碼:

  Change notification 
Console input 
Event 
Job 
Memory resource notification 
Mutex 
Process 
Semaphore 
Thread 
Waitable timer 








WaitForSingleObject函式用來檢測hHandle事件的訊號狀態,當函式的執行時間超過dwMilliseconds就返回,但如果引數dwMilliseconds為INFINITE時函式將直到相應時間事件變成有訊號狀態才返回,否則就一直等待下去,直到WaitForSingleObject有返回直才執行後面的程式碼。在這裡舉個例子:

先建立一個全域性Event物件g_event:

  CEvent g_event;

在程式中可以通過呼叫CEvent::SetEvent設定事件為有訊號狀態。

下面是一個執行緒函式MyThreadPro()

UINT CFlushDlg::MyThreadProc( LPVOID pParam ) 






  WaitForSingleObject(g_event,INFINITE); 


  For(;;) 






  { 

  } 

  return 0; 






在這個執行緒函式中只有設定g_event為有訊號狀態時才執行下面的for迴圈,因為g_event是全域性變數,所以我們可以在別的執行緒中通過g_event. SetEvent控制這個執行緒。



還有一種用法就是我們可以通過WaitForSingleObject函式來間隔的執行一個執行緒函式的函式體

  UINT CFlushDlg::MyThreadProc( LPVOID pParam ) 


{
  while(WaitForSingleObject(g_event,MT_INTERVAL)!=WAIT_OBJECT_0) 



  { 



  } 



  return 0; 






在這個執行緒函式中可以可以通過設定MT_INTERVAL來控制這個執行緒的函式體多久執行一次,當事件為無訊號狀態時函式體隔MT_INTERVAL執行一次,當設定事件為有訊號狀態時,執行緒就執行完畢了。

2)簡單說明WaitForSingleObject

DWORD WaitForSingleObject(HANDLE hObject,DWORD dwMilliseconds);

引數hObject:要等待的核心物件的控制代碼。
引數dwMilliseconds: 設定的等待超時的時間,以毫秒為單位。可以設定為INGINIT。  
  順便說一下,INFINITE已經定義為0xFFFFFFFF(或-1)。當然,傳遞INFINITE有些危險。如果物件永遠不變為已
  通知狀態,那麼呼叫執行緒永遠不會被喚醒,它將永遠處於死鎖狀態。
返回值:WAIT_OBJECT_0表示要等待的物件已經變為已通知的狀態。
  WAIT_TIMEOUT表示設定的時間超時。
  WAIT_FAILED表示失敗,可能是傳入的handle不正確或其他的問題。
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;
}

3)簡單說明WaitForMultipleObjects

DWORD WaitForMultipleObjects(DWORD dwCount,CONST HANDLE* phObjects,BOOL fWaitAll,DWORD dwMilliseconds);

引數dwCout:需要等待的核心物件的數量。
引數phObjects:需要等待的核心物件的是陣列的指標。
引數fWaitAll:表示是否需要等待所有的核心物件。
引數dwMilliseconds:設定等待超時的時間。(同上函式)

返回值:WAIT_FAILED和WAIT_TIMEOUT同上函式。
 如果為fWaitAll引數傳遞TRUE,同時所有物件均變為已通知狀態,那麼返回值是WAIT_OBJECT_0。如果為fWaitAll傳遞FALSE ,那麼一旦任何一個物件變為已通知狀態,該函式便返回。在這種情況下,你可能想要知道哪個物件變為已通知狀態。返回值是WAIT_OBJECT_0與(WAIT_OBJECT_0+dwCount- 1)之間的一個值。

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;
}