• <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
            數據加載中……

            WaitForMultipleObjects用法探索

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

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

             

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

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

            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.

            多個內核對象被觸發時,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)

                            {

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

             

                                switch(dwRet)

                                {

                                case WAIT_TIMEOUT:

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

                                    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 郭天文 閱讀(3828) 評論(1)  編輯 收藏 引用 所屬分類: VC++Windows Mobile

            評論

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

            解決辦法真巧妙,支持!
            2010-02-04 13:04 | mark
            东京热TOKYO综合久久精品| 精品人妻伦九区久久AAA片69| 久久久久久久久久久久久久| 久久亚洲AV无码精品色午夜麻豆| 色欲综合久久中文字幕网| 99精品久久精品一区二区| 精品久久久久中文字| 2020久久精品国产免费| 欧美激情精品久久久久久久| 国产午夜精品久久久久免费视| 香港aa三级久久三级老师2021国产三级精品三级在 | 久久天天躁狠狠躁夜夜96流白浆| 久久被窝电影亚洲爽爽爽| 伊人久久精品无码二区麻豆| 久久AAAA片一区二区| 99麻豆久久久国产精品免费| 久久精品国产99国产精品亚洲| 久久精品女人天堂AV麻| 99久久人妻无码精品系列| 一本色道久久HEZYO无码| 久久亚洲国产精品123区| 色综合久久天天综合| 国内精品伊人久久久久av一坑| 区久久AAA片69亚洲| 手机看片久久高清国产日韩| 国产伊人久久| 久久国产影院| 国产精品美女久久久网AV| 国产午夜福利精品久久2021| 欧美国产成人久久精品| 亚洲国产成人久久综合一| 久久久无码精品亚洲日韩按摩| 色天使久久综合网天天| 久久免费看黄a级毛片| 亚洲中文字幕无码久久2020| 国产A三级久久精品| 日日狠狠久久偷偷色综合免费 | 午夜精品久久久久久影视riav| 久久国产高清一区二区三区| 久久久91人妻无码精品蜜桃HD | 久久久久久久91精品免费观看|