• <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>

            大龍的博客

            常用鏈接

            統計

            最新評論

            WaitForMultipleObjects用法探索

            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-02 18:57 大龍 閱讀(16350) 評論(3)  編輯 收藏 引用

            評論

            # re: WaitForMultipleObjects用法探索 2009-02-19 12:01 Rs

            學習  回復  更多評論   

            # re: WaitForMultipleObjects用法探索 2009-12-29 09:48 asdfa

            錯誤  回復  更多評論   

            # re: WaitForMultipleObjects用法探索 2012-05-09 11:40 皋涵

            好文章  回復  更多評論   

            精品人妻伦九区久久AAA片69| 伊人久久综在合线亚洲2019| 亚洲&#228;v永久无码精品天堂久久| 99热成人精品热久久669| 亚洲国产精品久久久久婷婷老年| 精品久久久久久国产三级| 一级做a爰片久久毛片免费陪| 久久亚洲春色中文字幕久久久| 久久精品国产亚洲AV大全| 色综合久久最新中文字幕| 久久午夜无码鲁丝片午夜精品| 精品久久人妻av中文字幕| 久久青青草原精品国产软件| 久久99精品久久只有精品 | 久久99久久99精品免视看动漫| 亚洲精品白浆高清久久久久久| 99久久精品免费看国产| 久久精品国产亚洲AV高清热| 伊人热热久久原色播放www | 久久久精品人妻一区二区三区蜜桃| 久久精品国产亚洲AV大全| 日产精品久久久久久久| 国产精品成人99久久久久| 97超级碰碰碰久久久久| 亚洲精品乱码久久久久66| 欧美精品福利视频一区二区三区久久久精品 | 综合久久给合久久狠狠狠97色 | 免费一级欧美大片久久网| 日韩亚洲欧美久久久www综合网| 久久精品日日躁夜夜躁欧美| 久久久WWW免费人成精品| Xx性欧美肥妇精品久久久久久| 婷婷久久久亚洲欧洲日产国码AV| 思思久久好好热精品国产| 久久综合五月丁香久久激情| 久久夜色精品国产www| 久久精品国产一区二区电影| 丰满少妇人妻久久久久久4| 国产精品99久久久久久猫咪| 99久久亚洲综合精品成人| 成人国内精品久久久久影院VR|