青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

面對現實,超越自己
逆水行舟,不進則退
posts - 269,comments - 32,trackbacks - 0
1、主程序
 1 m_bStopMsg = TRUE;
 2         HANDLE hPromptThread = StartPromptThread();
 3         if (!hPromptThread)
 4         {
 5             LOG("啟動導入數據提示框線程失敗");
 6         }
 7 
 8         while (m_bStopMsg)
 9         {
10             MSG msg;
11             ::GetMessage( &msg, this->m_hWnd, NULL, NULL );
12             ::TranslateMessage( &msg );
13             ::DispatchMessage( &msg );
14         }

2、啟動線程
1 HANDLE CBarView::StartPromptThread()
2 {
3     LOG("啟動導入數據提示線程");
4     CWinThread* hThread = AfxBeginThread((AFX_THREADPROC)CBarView::RunPromptDialog,(LPVOID)this);
5 
6     return (m_hPromptThread = hThread->m_hThread);
7 }

3、線程函數
 1 DWORD WINAPI CBarView::RunPromptDialog(LPVOID Param)
 2 
 3      CBarView* barObj = (CBarView*)Param;
 4     barObj->waitObj = new CImportDataPromptDialog(); 
 5     barObj->waitObj->Create(IDD_DIALOGPROMPT, NULL);
 6 
 7     barObj->waitObj->ShowWindow(SW_SHOW);
 8  
 9     barObj->m_bStopMsg = FALSE;
10     return 0;
11 }

4、結束線程函數
 1 void CBarView::StopThread()
 2 {
 3     if (NULL != waitObj)
 4     {
 5         delete waitObj;
 6     }
 7 
 8     if (m_hPromptThread != NULL)
 9     {
10         ::TerminateThread(m_hPromptThread, 0 );
11         m_hPromptThread = NULL;
12         LOG("結束導入數據提示線程");
13     }
14 }

以下轉自:http://blog.csdn.net/hellothere/article/details/1788310

Windows多線程與對話框  

Windows的對話框是獲取信息輸入的主要手段,增加線程則是獲得更好UI響應的重要方式。由于Windows在處理對話框時進行線程調度的特殊性,如果不對此加以特別注意,增加線程可能不能帶來UI響應的改善。

1         跨線程創建對話框

1.1      需求

有這樣的應用場景:創建非模態對話框后需要馬上做些耗時的工作,而同時又希望能夠立刻在對話框上操作,所以,希望讓非模態對話框工作在單獨的線程上。

1.2      方案

主線程啟動一個UI線程,并且,讓這個線程創建非模態對話框。

想法是:既然用單獨的線程創建了對話框,所以,主線程在創建UI線程后,就可以繼續自己其他耗時的工作了。

1.3      實現

用一個簡單的例子程序來試驗這個方案:在VC++中創建一個基于SDIMFC應用程序,在其CView派生類中處理“Call”菜單命令,創建派生自CWinThreadUI線程,在這個UI線程初始化過程中創建一個對話框。

1.3.1      單獨的UI線程創建對話框

實現一個派生自CWinThreadUI線程類,其中最關鍵的是CreateMyDlgDestroyMyDlg函數。

類如下

class UIWorker : public CWinThread

{

    DECLARE_DYNCREATE(UIWorker)

protected:

    UIWorker();       // protected constructor used by dynamic creation

// Attributes

public:

// Operations

public:

    bool CreateMyDlg( void );

    void SetOwnerWnd( HWND hWnd );

    void DestroyMyDlg( void );

……   

private:

    CDlgUserTest* m_pDlgTest;

    HWND m_hOwnerWnd;

};

 

CreateMyDlgDestroyMyDlg的實現都非常簡單

bool UIWorker::CreateMyDlg( void )

{

    m_pDlgTest = new CDlgUserTest;

    if ( NULL == m_pDlgTest )

    {

        return false;

    }

    CWnd* pWnd = NULL;

    if ( NULL != m_hOwnerWnd )

    {

        pWnd = reinterpret_cast<CWnd*>( CWnd::FromHandle( m_hOwnerWnd ));

        if ( NULL == pWnd )

        {

            return false;

        }

    }

    BOOL bSuccess = m_pDlgTest->Create( IDD_DIALOG_TEST, pWnd );

    if ( bSuccess )

    {

        bSuccess = m_pDlgTest->ShowWindow( SW_SHOW );

    }    

    return bSuccess?true:false;

}

void UIWorker::DestroyMyDlg( void )

{  

    if ( NULL != m_pDlgTest )

    {

        delete m_pDlgTest;

        m_pDlgTest = NULL;

    }

}

 

1.3.2      主線程創建UI線程

主線程就更加簡單了。在菜單的對應操作中,創建線程,為了表示主線程繼續工作,提供一個循環。

bool CUserView::Call(void)

{

    m_pUIWorker = static_cast<UIWorker*>( AfxBeginThread(

        RUNTIME_CLASS( UIWorker )));

    for ( int i = 0; i < 100000; ++i )

        for ( int j = 0; j < 10000; ++j )

            ;   

    return true;

}

 

1.4      結果:奇怪的延遲

希望達到的效果是:

主程序啟動后,顯示一個單文檔視界面,有一個Work菜單

 

點擊Call菜單后,對話框應該馬上彈出,顯示為:

 

執行中,對話框不會馬上彈出,而會等待一定的時間,直到循環結束,CUserViewCall函數返回,對話框才會彈出。等待的時間和循環的長短成正比。

2         問題分析

2.1      不單純的對話框:要求Windows作特殊處理

對話框是一種很不單純的窗口。無論是創建、消息分發還是銷毀,Windows都會對對話框做一些特殊的處理。如果用SDK進行對話框編程,就會發現創建對話框需要專門的Win32 API。而且,我們查閱平臺SDK的講述時,也會發現對話框需要Windows進行若干額外的“照顧”。事實上,之所以會出現前述的“延遲”情況,就是Windows進行額外協調的結果。

2.2      窗口協調導致等待

2.2.1      Windows協調對話框彈出過程

使用SPY++研究窗口消息,會發現非模態對話框創建時,原來擁有焦點的窗口會收到WM_KILLFOCUS消息,而且獲得焦點的窗口是創建的對話框。

2.2.2      線程需要分發消息,不能堵塞

根據例子來看,這個窗口焦點的協調過程被上升到了線程協調的層次?,F象就是:如果被去激活的窗口的線程被阻塞,不能立刻處理WM_KILLFOCUS消息的話,創建對話框的線程也會被阻塞,對話框一直不能被顯示出來,直到線程不再阻塞,WM_KILLFOCUS被分發和處理。

2.3      解決方案

這個問題產生的原因是:在主線程繁忙的時候有主線程必須要處理的消息,也就是主線程消息循環因為窗口處理函數占用時間過長而被阻塞。因此,這個問題更多是一個設計問題而非技術難點。也許,我們該問的是:

n         我真的要用一個冗長的工作來阻塞主線程這樣長的時間嗎?

n         我是否可以在單獨的一個工作者線程中來處理這個長的工作?

考慮了其他的可能性后,如果對上述問題的答案仍然為“是”的話,可以采取以下解決方案:因為我們缺少的是消息循環,所以,加上消息循環,讓對話框能夠顯示出來之后,再去進行其他工作的處理。

bool CUserView::Call(void)

{

    m_pUIWorker = static_cast<UIWorker*>( AfxBeginThread(

        RUNTIME_CLASS( UIWorker )));  

    while ( !m_pUIWorker->GetDoneFlag())

    {

        MSG msg;

        ::GetMessage( &msg, this->m_hWnd, NULL, NULL );

        ::TranslateMessage( &msg );

        ::DispatchMessage( &msg );

    }

    for ( int i = 0; i < 100000; ++i )

        for ( int j = 0; j < 10000; ++j )

            ;   

    return true;

}

紅色的代碼就是加上消息循環。要注意的是,相應的線程類里面應該在顯示出對話框后設置一個標志,并且讓主線程可以查詢到這個標志,從而終止這個臨時的消息循環。

3         啟示

3.1      Windows線程調度

Windows的線程調度原則對于程序員來說非常簡單。這條原則是:程序員無法決定線程調度過程。

只是因為“程序員無法決定線程調度過程”,并不意味著程序員不應該去了解一些特別的線程調度過程。在某些場合下,正如上面在和對話框相關的某些時機,也許,Windows的線程調度是有明確規則的。所以,大多數情況下,程序員可以認為Windows的線程調度對于自己來說是一個黑盒。但是,某些時候,這個盒子中間發生的事情也需要了解和掌握。

3.2      對話框

對話框是一個古老的話題,很多的人仔細討論了對話框的方方面面。對話框一直是Windows里面非常特殊的一種窗口。它的消息循環,與其他窗口的協調要求,都和普通的窗口有不同之處。因此,為了配合這些不同之處,Windows在線程協調上也做了一些手腳。

3.3      多線程編程更多是一種設計

更重要的啟示是:多線程需要更多的考慮設計。

毫無疑問,多線程可以使多種工作并行進行,提高工作效率,改善界面響應。然而,多線程應用中一個麻煩的問題是:決定對哪些工作使用單獨的線程。這個決定過程其實就是設計過程。如果設計方案不合理,比如,如本例子中反映出來的問題——在主線程被長時間的工作阻塞的情況下,增加的線程并不會給我們帶來明顯的響應改善。而且,如果設計方案不合理,會帶來更多的“臨時機制”的采用,如本例中必須增加一個單獨的消息循環,并且需要在兩個線程中就對話框是否創建出來進行通訊。這樣的實現在很大程度上削減了希望用多線程帶來的好處。

posted on 2012-08-20 12:45 王海光 閱讀(2986) 評論(0)  編輯 收藏 引用 所屬分類: MFC
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            香蕉成人久久| 午夜欧美电影在线观看| 欧美成人免费大片| 欧美成人官网二区| 男人的天堂亚洲| 欧美成年网站| 欧美视频网址| 国产日韩欧美精品在线| 国内精品久久国产| 亚洲国产精品一区二区尤物区| 亚洲成人在线| 亚洲日本黄色| 亚洲天堂久久| 久久久噜噜噜久久狠狠50岁| 麻豆精品传媒视频| 99精品福利视频| 久久aⅴ国产紧身牛仔裤| 久久综合久久综合九色| 欧美激情精品久久久久久变态| 欧美视频一区二区三区…| 国产亚洲精品久| 亚洲肉体裸体xxxx137| 亚洲欧美视频| 免费一级欧美在线大片| 亚洲美女av黄| 亚洲第一狼人社区| 一区二区三区四区五区精品| 亚洲一区高清| 亚洲国产高清一区| 中文久久乱码一区二区| 久久在精品线影院精品国产| 国产精品人成在线观看免费 | 久久精品国产96久久久香蕉| 男人插女人欧美| 国产日韩精品一区二区三区在线| 一本色道久久综合亚洲精品小说| 欧美一级淫片aaaaaaa视频| 亚洲电影在线| 欧美在线一二三四区| 欧美视频成人| 亚洲日韩欧美一区二区在线| 欧美综合第一页| 日韩一级在线观看| 久久午夜影视| 国产日韩欧美在线播放不卡| 在线视频日本亚洲性| 欧美国产日韩亚洲一区| 欧美怡红院视频一区二区三区| 欧美欧美全黄| 亚洲精品乱码久久久久久黑人| 久久免费视频在线| 久久久激情视频| 国产精品视频网站| 一区二区三区精品久久久| 欧美国产一区二区在线观看 | 欧美/亚洲一区| 国产欧美精品| 欧美在线观看视频| 亚洲综合色丁香婷婷六月图片| 欧美日韩另类在线| 宅男噜噜噜66一区二区 | 久久综合九色99| 午夜久久福利| 国产一区香蕉久久| 久久久久久黄| 久久aⅴ国产紧身牛仔裤| 国产欧美一区二区精品忘忧草| 性色av一区二区三区| 先锋影音一区二区三区| 国产日韩精品一区二区三区在线 | 亚洲在线黄色| 亚洲线精品一区二区三区八戒| 欧美三区在线视频| 午夜精品久久久久久久99黑人| 午夜精品99久久免费| 国产亚洲综合精品| 欧美 日韩 国产精品免费观看| 久久久午夜视频| 亚洲精品日产精品乱码不卡| 日韩一区二区精品视频| 国产精品乱码一区二区三区| 久久激情婷婷| 狼人天天伊人久久| 亚洲精品偷拍| 中文久久精品| 精品成人久久| 亚洲精品久久视频| 国产精品三区www17con| 久久人人爽人人爽爽久久| 久久久99免费视频| 夜夜夜久久久| 亚洲一区二区欧美日韩| 亚洲高清久久网| 99视频有精品| 娇妻被交换粗又大又硬视频欧美| 亚洲国产另类 国产精品国产免费| 亚洲国产精品va| 欧美日韩精品免费观看视一区二区 | 午夜一区在线| 亚洲人成艺术| 国产精品99久久久久久久久| 狠狠色综合网| 亚洲国产婷婷香蕉久久久久久99| 香蕉国产精品偷在线观看不卡| 欧美伊人久久| 亚洲一区二区三区在线播放| 久久久久久婷| 性欧美videos另类喷潮| 欧美日韩高清在线| 欧美va亚洲va国产综合| 国产精品久久毛片a| 欧美激情一区二区三区高清视频| 国产伦精品一区二区三区高清| 亚洲激情视频在线播放| 国产亚洲福利社区一区| 日韩视频三区| 91久久久在线| 欧美中日韩免费视频| 午夜激情一区| 欧美午夜精品理论片a级按摩| 亚洲第一在线| 亚洲东热激情| 性刺激综合网| 欧美在线免费看| 国产精品日韩高清| 在线一区二区三区做爰视频网站| 亚洲激情第一页| 欧美a级理论片| 欧美成人中文字幕| 在线成人激情视频| 久久久久久久波多野高潮日日 | 亚洲综合色视频| 欧美插天视频在线播放| 美女诱惑一区| 在线免费观看日本欧美| 久久婷婷国产综合国色天香| 久久精品首页| 国产视频久久| 久久国产精品久久久| 久久激情五月激情| 国产一区欧美| 久久国产福利国产秒拍| 久久青青草原一区二区| 伊人春色精品| 久久精品国产免费观看| 欧美波霸影院| 日韩香蕉视频| 欧美日韩在线观看一区二区三区| 一本久久综合亚洲鲁鲁五月天| 亚洲已满18点击进入久久| 国产精品私人影院| 久久成人精品一区二区三区| 欧美成人自拍视频| 一区二区三区日韩| 国产精品一区一区| 久久手机免费观看| 亚洲精品国产日韩| 亚洲欧美国内爽妇网| 国产欧美日韩亚洲精品| 久久精品国产免费看久久精品| 欧美黑人在线观看| 亚洲中午字幕| 黄色在线成人| 欧美人与性动交α欧美精品济南到 | 午夜在线精品| 国内精品久久久久久影视8| 麻豆精品精品国产自在97香蕉| 欧美三级韩国三级日本三斤| 亚洲精品一区二区在线| 亚洲网站在线播放| 国产日韩欧美亚洲| 欧美成人激情视频| 亚洲一区中文| 欧美激情五月| 亚洲免费一在线| 在线观看视频免费一区二区三区| 欧美激情精品久久久久久| 亚洲男女自偷自拍| 亚洲狠狠丁香婷婷综合久久久| 亚洲综合国产激情另类一区| 国内精品久久久久影院色 | 亚洲国产99| 午夜视频在线观看一区二区三区| 狠狠做深爱婷婷久久综合一区| 欧美高清在线一区二区| 香蕉成人伊视频在线观看| 亚洲国产一区二区在线| 久久精品91| 亚洲一区二区三区高清| 在线精品一区| 国产视频久久网| 国产精品对白刺激久久久| 牛牛影视久久网| 久久成人免费| 亚洲欧美日韩在线播放| 这里只有视频精品| 日韩视频一区二区三区在线播放| 免费久久99精品国产自在现线| 性欧美18~19sex高清播放| 在线一区二区三区做爰视频网站|