1. 程式人生 > 其它 >WaitForMultipleObjects用法詳解,一看就懂

WaitForMultipleObjects用法詳解,一看就懂

WaitForMultipleObjects是Windows中的一個功能非常強大的函式,幾乎可以等待Windows中的所有的核心物件

函式原型為:

DWORD WaitForMultipleObjects(  
  DWORD nCount,             // number of handles in the handle array  
  CONST HANDLE *lpHandles,  // pointer to the object-handle array  
  BOOL fWaitAll,            // wait flag  
  DWORD dwMilliseconds      // time-out interval in milliseconds  
);  

引數解析:

DWORD 就是 Double Word, 每個word為2個位元組的長度,DWORD雙字即為4個位元組,每個位元組是8位。

nCount  指定列表中的控制代碼數量  最大值為MAXIMUM_WAIT_OBJECTS(64)  

*lpHandles 控制代碼陣列的指標。lpHandles為指定物件控制代碼組合中的第一個元素 HANDLE型別可以為(Event,Mutex,Process,Thread,Semaphore)陣列  

bWaitAll 等待的型別,如果為TRUE,表示除非物件都發出訊號,否則就一直等待下去;如果FALSE,表示任何物件發出訊號即可 

dwMilliseconds指定要等候的毫秒數。如設為零,表示立即返回。如指定常數INFINITE,則可根據實際情況無限等待下去 

函式的返回值有:

 WAIT_ABANDONED_0:所有物件都發出訊息,而且其中有一個或多個屬於互斥體(一旦擁有它們的程序中止,就會發出訊號)

 WAIT_TIMEOUT:物件保持未發訊號的狀態,但規定的等待超時時間已經超過

 WAIT_OBJECT_0:所有物件都發出訊號

WAIT_IO_COMPLETION:(僅適用於WaitForMultipleObjectsEx)由於一個I/O完成操作已作好準備執行,所以造成了函式的返回

返回WAIT_FAILED則表示函式執行失敗,會設定GetLastError

如bWaitAll為FALSE,那麼返回結果相似,只是可能還會返回相對於WAIT_ABANDONED_0或WAIT_OBJECT_0的一個正偏移量,指出哪個物件是被拋棄還是發出訊號。

WAIT_OBJECT_0是微軟定義的一個巨集,你就把它看成一個數字就可以了。

例如,WAIT_OBJECT_0 + 5的返回結果意味著列表中的第5個物件發出了訊號

如果程式中的nObjectWait是WAIT_OBJECT_0 + 5

int nIndex = nObjectWait - WAIT_OBJECT_0;就是說nIndex =5也就表示第5個物件發出了訊號

例子:

當 bWaitAll引數為FALSE可以等待其中之一的事件  

HANDLE m_hEvent[2];      
 //兩事件   
 
m_hEvent[0]=CreateEvent(NULL, FALSE, FALSE, NULL);    
m_hEvent[1]=CreateEvent(NULL, FALSE, FALSE, NULL);    
CreateThread(NULL, 0, MyThreadProc, this, 0, NULL);    
DWORD WINAPI MyThreadProc(LPVOID lpParam)    
{     
while(TRUE)    
 {  //每次等500毫秒    
 int nIndex = WaitForMultipleObjects(2, pThis->m_hEvent, FALSE,500);       
 if (nIndex == WAIT_OBJECT_0 + 1)     
 {    
 //第二個事件發生   //ExitThread(0);   //break;     
}     
 else if (nIndex == WAIT_OBJECT_0) //第一個事件發生     
{     
 //第一個事件   
   }      
else if (nIndex == WAIT_TIMEOUT) //超時500毫秒     
{   //超時可作定時用     
}     
}    
 OutputDebugString("執行緒結束. /n");    
 return 0L;}    

當要處理第一個事件時,你只需執行SetEvent(m_hEvent[0]);  即可進入第一個事件的位置

當要執行第二個事件時執行SetEvent(m_hEvent[1]);    

當 bWaitAll引數為TRUE等待所有的事件  

DWORD WINAPI MyThreadProc(LPVOID lpParam)    
 while(TRUE)    
{  //每次等500毫秒     
nt nIndex = WaitForMultipleObjects(2, pThis->m_hEvent, TRUE,500);       
if (WAIT_OBJECT_0 + 1<= nIndex <= WAIT_OBJECT_0) //所有事件發生    
{     
 //所有的訊號量都有效時(事件都發生)其中之一無效。    
}