如何用WaitForMultipleObjects獲取所有被同時觸發的內核對象

原型: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;

    }


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章