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

WaitForMultipleObjects用法詳解,一看就懂

原文:https://blog.csdn.net/sac761/article/details/52456385
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毫秒    
		int nIndex = WaitForMultipleObjects(2, pThis->m_hEvent, TRUE,500);     
		if (WAIT_OBJECT_0 + 1<= nIndex <= WAIT_OBJECT_0) //所有事件發生   
		{   
		//所有的訊號量都有效時(事件都發生)其中之一無效。   
		}
	}
}   


本文來自 sac761 的CSDN 部落格 ,全文地址請點選:https://blog.csdn.net/sac761/article/details/52456385?utm_source=copy