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

            大龍的博客

            常用鏈接

            統(tǒng)計(jì)

            最新評(píng)論

            WaitForMultipleObjects用法探索

            WaitForMultipleObjects用法探索
                                    

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

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

             

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

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

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

            這兒又會(huì)產(chǎn)生一個(gè)問題,如果序號(hào)最小的那個(gè)對(duì)象頻繁被觸發(fā),那么序號(hào)比它大的內(nèi)核對(duì)象將的不到被出理的機(jī)會(huì)。

            為了解決這一問題,可以采用雙WaitForMultipleObjects檢測(cè)機(jī)制來實(shí)現(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++);

                            //同時(shí)檢測(cè)其他的事件

                            while(nIndex < nCount)

                            {

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

             

                                switch(dwRet)

                                {

                                case WAIT_TIMEOUT:

                                    nIndex = nCount; //退出檢測(cè),因?yàn)闆]有被觸發(fā)的對(duì)象了.

                                    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 大龍 閱讀(16351) 評(píng)論(3)  編輯 收藏 引用

            評(píng)論

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

            學(xué)習(xí)  回復(fù)  更多評(píng)論   

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

            錯(cuò)誤  回復(fù)  更多評(píng)論   

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

            好文章  回復(fù)  更多評(píng)論   


            只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。
            網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


            99精品久久久久久久婷婷| 国产精品一区二区久久| 午夜精品久久久久| 久久久SS麻豆欧美国产日韩| 香蕉久久夜色精品升级完成| 久久99国产精品一区二区| 国产精品无码久久四虎| 久久无码AV中文出轨人妻| 精品久久久久久综合日本| 久久综合久久鬼色| 久久婷婷五月综合色奶水99啪| 久久精品国产亚洲av高清漫画 | 亚洲αv久久久噜噜噜噜噜| 久久国产亚洲精品麻豆| 亚洲精品国产第一综合99久久| 久久国产亚洲精品麻豆| 亚洲国产精品无码久久SM| 激情久久久久久久久久| 久久久久久久人妻无码中文字幕爆| 久久久青草青青国产亚洲免观| 狠狠狠色丁香婷婷综合久久俺| 久久久精品人妻一区二区三区蜜桃 | 国产69精品久久久久观看软件| 91精品国产91热久久久久福利| 一本大道久久香蕉成人网| 国产免费福利体检区久久| 99久久精品国产高清一区二区 | 久久99精品九九九久久婷婷| 久久99国产综合精品免费| 国产A三级久久精品| 中文国产成人精品久久亚洲精品AⅤ无码精品 | 中文字幕久久波多野结衣av| 亚洲欧美成人久久综合中文网| 亚洲天堂久久精品| 久久综合综合久久狠狠狠97色88| 久久久久亚洲AV成人片| 久久久久久无码Av成人影院| 久久青青草原亚洲av无码app| 久久精品黄AA片一区二区三区| 色欲av伊人久久大香线蕉影院| 久久久噜噜噜久久中文字幕色伊伊|