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

            S.l.e!ep.¢%

            像打了激速一樣,以四倍的速度運(yùn)轉(zhuǎn),開心的工作
            簡(jiǎn)單、開放、平等的公司文化;尊重個(gè)性、自由與個(gè)人價(jià)值;
            posts - 1098, comments - 335, trackbacks - 0, articles - 1
              C++博客 :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理

            下面的代碼我調(diào)試了將近一個(gè)星期,你能夠看出什么地方出了問題嗎?

            線程函數(shù):

            DWORD?WINAPI?ThreadProc(
            ????
            while ( ! bTerminate)
            ????
            {
            ????????
            // ?從一個(gè)鏈表中讀取信息并且插入到CListCtrl中
            ????????
            // ?CListCtrl的句柄是通過線程參數(shù)傳遞進(jìn)來的
            ???????? for (;;)
            ???????
            {
            ???????????ReadInfoFromList();
            ???????????InsertToCListCtrl();
            ????????}

            ????}

            }
            主線程中使用CreateThread啟動(dòng)線程。

            當(dāng)想終止子線程時(shí),在主線程中:
            bTerminate = TRUE;
            WaitForSingleObject(threadHandle, INFINITE);
            可是,以運(yùn)行到WaitForSingleObject,子線程就Crash了。

            為什么呢?

            問題原因:
            后來我終于在InsertItem的反匯編中發(fā)現(xiàn)了如下的代碼
            call dword ptr [__imp__SendMessageA@16 (7C141B54h)]
            可見,InsertItem是必須借助消息循環(huán)來完成任務(wù)的。如果我們?cè)谥骶€程中WaitForSingleObject了,必然導(dǎo)致主線程阻塞,也就導(dǎo)致了消息循環(huán)的阻塞,最終導(dǎo)致工作線程Crash掉了*_*

            解決方案:
            為了解決在主線程中Wait的問題,微軟專門設(shè)計(jì)了一個(gè)函數(shù)MsgWaitForMultipleObjects,這個(gè)函數(shù)即可以等待信號(hào)(thread,event,mutex等等),也可以等待消息(MSG)。即不論有信號(hào)被激發(fā)或者有消息到來,此函數(shù)都可以返回。呵呵,那么我的解決辦法也就出來了。
            將上面的WaitForSingleObject用下面的代碼替換:
            while(TRUE)
            {

            ????DWORD?result?;?
            ????MSG?msg?;?

            ????result?
            =?MsgWaitForMultipleObjects(1,?&readThreadHandle,?
            ????????FALSE,?INFINITE,?QS_ALLINPUT);?

            ????
            if?(result?==?(WAIT_OBJECT_0))
            ????
            {
            ????????
            break;
            ????}
            ?
            ????
            else?
            ????
            {?
            ????????PeekMessage(
            &msg,?NULL,?0,?0,?PM_REMOVE);
            ????????DispatchMessage(
            &msg);?
            ????}
            ?
            }


            總結(jié):
            如果在工作線程中有可能涉及到了消息驅(qū)動(dòng)的API,那么不能在主線程中使用WaitForSingleObject一類函數(shù),而必須使用上述的方案。

            Feedback

            # re: 在主線程中慎用WaitForSingleObject (WaitForMultipleObjects) (轉(zhuǎn))  回復(fù)  更多評(píng)論   

            2009-06-26 11:42 by hhy
            呵呵,頂一個(gè),少走彎路了 :)

            # re: 在主線程中慎用WaitForSingleObject (WaitForMultipleObjects) (轉(zhuǎn))  回復(fù)  更多評(píng)論   

            2009-12-02 10:11 by aaa
            好文章要頂。

            # re: 在主線程中慎用WaitForSingleObject (WaitForMultipleObjects) (轉(zhuǎn))  回復(fù)  更多評(píng)論   

            2009-12-10 07:20 by Tiany
            謝謝你的好文章! 我也為這個(gè)問題煩惱了2天了 碰巧來到你這里 哈!給解決了 以后會(huì)經(jīng)常來看你的

            # re: 在主線程中慎用WaitForSingleObject (WaitForMultipleObjects) (轉(zhuǎn))  回復(fù)  更多評(píng)論   

            2010-03-27 01:31 by
            我正遇到幾乎一樣的問題了,仍然沒有解決。對(duì)你的觀點(diǎn)有疑問。
            我下面的代碼和你說的幾乎一樣,但是每次都能正確執(zhí)行。?????
            我的qq:312763408


            DWORD CTestClistCtrlDlg:: ThreadSendData (LPVOID lParam)
            {

            CTestClistCtrlDlg *p = (CTestClistCtrlDlg*)lParam;

            CString strOut;
            int i = 0;
            g_bStop = false;


            while (!g_bStop)
            {

            p->m_ctlMyTable.InsertItem(i,"1");
            p->m_ctlMyTable.SetItemText(i,1,"haha");
            Sleep(1);
            }

            TRACE("end \n");
            return 0;

            }
            void CTestClistCtrlDlg::OnBtnStop()
            {
            // TODO: Add your control notification handler code here
            g_bStop = true;
            WaitForSingleObject (m_hThread, INFINITE);
            }
            精品久久久久久中文字幕| 日韩AV毛片精品久久久| 国内精品综合久久久40p| 亚洲精品无码专区久久久| 久久久久国产一级毛片高清版| 国内精品久久久久久不卡影院| 日韩欧美亚洲国产精品字幕久久久| 久久婷婷五月综合97色直播| 国产精品久久波多野结衣| 欧洲国产伦久久久久久久| 久久国产精品99国产精| 久久99精品免费一区二区| 国产精品对白刺激久久久| 亚洲国产成人久久综合一区77| 久久国产色AV免费看| 亚洲а∨天堂久久精品| 国产精品久久网| 亚洲第一极品精品无码久久| 人妻中文久久久久| 99久久精品国产一区二区三区| 少妇内射兰兰久久| 四虎国产精品成人免费久久| 精品无码久久久久久久动漫| 国内精品久久人妻互换| 亚洲国产精品无码久久久不卡| 久久久久亚洲AV无码专区桃色| 久久97精品久久久久久久不卡 | 亚洲∧v久久久无码精品| 久久精品国产99久久丝袜| 日本精品久久久久中文字幕| 久久棈精品久久久久久噜噜| 亚洲AV日韩精品久久久久久 | 久久久亚洲欧洲日产国码二区| 久久这里都是精品| 久久久久青草线蕉综合超碰| 国内精品久久久久影院亚洲| 久久天天躁狠狠躁夜夜2020一| 伊人久久亚洲综合影院| 亚洲伊人久久综合影院| 久久天天躁夜夜躁狠狠躁2022| 一级女性全黄久久生活片免费|