• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            隨筆 - 2, 文章 - 73, 評論 - 60, 引用 - 0
            數(shù)據(jù)加載中……

            WaitForMultipleObjects用法探索

            WaitForMultipleObjectsWindows中的一個功能非常強大的函數(shù),幾乎可以等待Windows中的所有的內(nèi)核對象(關(guān)于該函數(shù)的描述和例子見MSDN,)。但同時該函數(shù)在用法上卻需要一定的技巧。

            原型DWORD WaitForMultipleObjects(
             DWORD nCount,
             const HANDLE* lpHandles,
             BOOL bWaitAll,
             DWORD dwMilliseconds
            );

             

            WaitForMultipleObjects等到多個內(nèi)核對象的時候,如果它的bWaitAll 參數(shù)設(shè)置為false。其返回值減去WAIT_OBJECT_0 就是參數(shù)lpHandles數(shù)組的序號。如果同時有多個內(nèi)核對象被出發(fā),這個函數(shù)返回的只是其中序號最小的那個。

            問題就在這里,我們?nèi)绾慰梢垣@取所有被同時觸發(fā)的內(nèi)核對象。舉個例子:我們需要在一個線程中處理從完成端口、數(shù)據(jù)庫、和可等待定時器來的數(shù)據(jù)。一個典型的實現(xiàn)方法就是:用WaitForMultipleObjects等待所有的這些事件。如果完成端口,數(shù)據(jù)庫發(fā)過來的數(shù)據(jù)量非常大,可等待定時器時間也只有幾十毫秒。那么這些事件同時觸發(fā)的幾率可以說非常大,我們不希望丟棄任何一個被觸發(fā)的事件。那么如何能高效地實現(xiàn)這一處理呢?

            MSDN中有一句非常重要的描述,它可以說是WaitForMultipleObjects用法的精髓:The function modifies the state of some types of synchronization objects. Modification occurs only for the object or objects whose signaled state caused the function to return. For example, the count of a semaphore object is decreased by one. When bWaitAll is FALSE, and multiple objects are in the signaled state, the function chooses one of the objects to satisfy the wait; the states of the objects not selected are unaffected.

            多個內(nèi)核對象被觸發(fā)時,WaitForMultipleObjects選擇其中序號最小的返回。而WaitForMultipleObjects它只會改變使它返回的那個內(nèi)核對象的狀態(tài)。

            這兒又會產(chǎn)生一個問題,如果序號最小的那個對象頻繁被觸發(fā),那么序號比它大的內(nèi)核對象將得不到被處理的機會。

            為了解決這一問題,可以采用雙WaitForMultipleObjects檢測機制來實現(xiàn)。見下面的例子:

            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)

                            {

                                dwRet = WaitForMultipleObjects(nCount - nIndex,&pHandles[nIndex],false,0);

             

                                switch(dwRet)

                                {

                                case WAIT_TIMEOUT:

                                    nIndex = nCount; //退出檢測,因為沒有被觸發(fā)的對象了.

                                    break;

                                case WAIT_FAILED:

                                    return 1;

                                default:

                                    {

                                        nIndex = dwRet - WAIT_OBJECT_0;

                                        ProcessHanlde(nIndex++);

                                    }

                                    break

                                }

                            }

                        }

                        break;

                    }

                }

                return 0;

            }

            posted on 2007-12-25 11:09 郭天文 閱讀(3810) 評論(1)  編輯 收藏 引用 所屬分類: VC++Windows Mobile

            評論

            # re: WaitForMultipleObjects用法探索  回復  更多評論   

            解決辦法真巧妙,支持!
            2010-02-04 13:04 | mark
            久久久亚洲精品蜜桃臀| 国产视频久久| 欧美精品国产综合久久| 亚洲天堂久久久| 欧美va久久久噜噜噜久久| 国内精品久久国产| 精品久久久久久| 伊人久久大香线蕉综合网站| 国产毛片欧美毛片久久久 | 少妇熟女久久综合网色欲| 久久精品国产AV一区二区三区| 色99久久久久高潮综合影院| 久久久久亚洲AV无码专区桃色| 亚洲欧洲中文日韩久久AV乱码| 欧美日韩成人精品久久久免费看 | 好久久免费视频高清| 人人狠狠综合久久亚洲婷婷| 欧美久久天天综合香蕉伊| 2021少妇久久久久久久久久| 亚洲国产成人久久一区久久| 久久国产免费观看精品| 久久www免费人成看片| 国产成人99久久亚洲综合精品| 久久婷婷国产剧情内射白浆 | 久久人人爽人人澡人人高潮AV| 亚洲国产精品无码久久久蜜芽| 久久国产精品波多野结衣AV| 国内精品久久久久久99蜜桃| 久久午夜夜伦鲁鲁片免费无码影视| 伊人热人久久中文字幕| 人妻无码久久一区二区三区免费 | 波多野结衣中文字幕久久| 欧美日韩久久中文字幕| 久久99精品久久久久久9蜜桃| 熟妇人妻久久中文字幕| 久久无码高潮喷水| 一本大道久久东京热无码AV| 精品多毛少妇人妻AV免费久久| 狠狠色丁香久久综合婷婷| www.久久热.com| 国内精品久久国产大陆|