原型:DWORD WaitForMultipleObjects(
DWORD nCount,
const HANDLE* lpHandles,
BOOL bWaitAll,
DWORD dwMilliseconds
);
當WaitForMultipleObjects等到多個內核對象的時候,如果它的bWaitAll 參數設置爲false。其返回值減去WAIT_OBJECT_0 就是參數lpHandles數組的序號。如果同時有多個內核對象被觸發,這個函數返回的只是其中序號最小的那個。如果爲TRUE 則等待所有信號量有效再往下執行。(FALSE 當有其中一個信號量有效時就向下執行)
多個內核對象被觸發時,WaitForMultipleObjects選擇其中序號最小的返回。而WaitForMultipleObjects它只會改變使它返回的那個內核對象的狀態。
這兒又會產生一個問題,如果序號最小的那個對象頻繁被觸發,那麼序號比它大的內核對象將得不到被處理的機會。
爲了解決這一問題,可以採用雙WaitForMultipleObjects檢測機制來實現。見下面的例子:
DWORD WINAPI ThreadProc(LPVOID lpParameter)
{
DWORD dwRet = 0;
int nIndex = 0;
while(1)
{
dwRet = WaitForMultipleObjects(nCount,pHandles,false,INFINITE);
switch(dwRet)
{
case WAIT_TIMEOUT:
break;
case WAIT_FAILED:
return 1;
default:
{
nIndex = dwRet - WAIT_OBJECT_0;
ProcessHanlde(nIndex++);
//同時檢測其他的事件
while(nIndex < nCount) //nCount事件對象總數
{
dwRet = WaitForMultipleObjects(nCount - nIndex,&pHandles[nIndex],false,0);
switch(dwRet)
{
case WAIT_TIMEOUT:
nIndex = nCount; //退出檢測,因爲沒有被觸發的對象了.
break;
case WAIT_FAILED:
return 1;
default:
{
nIndex = nIndex + dwRet - WAIT_OBJECT_0;
ProcessHanlde(nIndex++);
}
break
}
}
}
break;
}
}
return 0;
}