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) //所有事件發生
{
//所有的訊號量都有效時(事件都發生)其中之一無效。
}