小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

MFC如何在線程中實(shí)時(shí)刷新界面

 禁忌石 2017-03-30

1.工作者SendMessage讓UI線程去更新界面
2.不要把CWnd指針傳遞到線程中,而是把CWnd所對(duì)應(yīng)的HWND窗口句柄傳遞進(jìn)去,
在線程內(nèi)部,直接使用該句柄,使用windows API來更新界面,而不要在線程中用CWnd的方法來更新界面。
因?yàn)镸FC不是線程安全的。


請(qǐng)問老師,為什么不能用CWnd方法來更新界面。能詳細(xì)解釋下嗎?
為什么我用
//===================第1種在線程中更新界面的方式=================================
HANDLE thread1=CreateThread(NULL,0,xianchen,m_hWnd,0,NULL); //傳入窗口句柄。m_hWnd

//線程中的代碼
CfeizuobiaoDlg * pp=(CfeizuobiaoDlg * )CWnd::FromHandle((HWND)canshu); //通過窗口句柄得到窗口的對(duì)象指針
pp->GetDlgItem(IDC_EDIT4)->SetWindowTextW(_T("我是菜鳥?")); //通過窗口對(duì)象,更新界面


//===================第2種在線程中更新界面的方式===================
CWnd *hwnd = GetDlgItem(IDC_EDIT4); //得到控件句柄
HANDLE thread1=CreateThread(NULL,0,xianchen,hwnd,0,NULL); //傳入得到的控件句柄。

//線程中的代碼
CWnd *pp=(CWnd*)canshu;  //得到控件句柄。
pp->SetWindowTextW(_T("我是菜鳥。")); //顯示


//===================第3種在線程中更新界面的方式=========================
HANDLE thread1=CreateThread(NULL,0,xianchen,this,0,NULL); //傳入當(dāng)前窗口的對(duì)象。

//線程中的代碼
CfeizuobiaoDlg * pp=(CfeizuobiaoDlg * )canshu;  //直接得到窗口的對(duì)象
pp->GetDlgItem(IDC_EDIT4)->SetWindowTextW(_T("我是菜鳥!")); //顯示

都可以成功更新的啊。


這樣做都能實(shí)現(xiàn)效果,但是之所以不能這樣做,是因?yàn)橛锌赡墚a(chǎn)生問題,雖然出現(xiàn)問題的概率很低很低,但仍然無法保證百分百不出問題,自己寫一些小程序的話當(dāng)然沒有關(guān)系,但如果寫一些正式的商業(yè)軟件,特別是需要7X24小時(shí)穩(wěn)定運(yùn)行的軟件,都不會(huì)這樣做。其實(shí)這是一個(gè)多線程編程的問題,并不只是在MFC中需要注意,在所有多線程并發(fā)編程中都應(yīng)該注意,當(dāng)你直接把CWND指針傳遞到工作者線程中以后,現(xiàn)在就有兩個(gè)線程(UI線程和工作者線程)都可以同時(shí)調(diào)用這個(gè)CWND指針的方法,而MFC不像STL那樣,MFC的對(duì)象不是線程安全的,訪問的時(shí)候都沒有加鎖,程序運(yùn)行起來后,可能出現(xiàn)這樣一個(gè)狀況,即某個(gè)時(shí)刻,兩個(gè)線程同時(shí)調(diào)用了同一個(gè)CWND對(duì)象的方法,就會(huì)帶來一些不可預(yù)料的多線程競(jìng)態(tài)問題,從而出現(xiàn)一些不可預(yù)料的錯(cuò)誤。你要這樣想,我們?cè)诙嗑€程編程中,多個(gè)線程需要訪問同一個(gè)變量的時(shí)候,是不是應(yīng)該加鎖訪問,那么UI線程和工作者線程在訪問同一個(gè)CWND對(duì)象時(shí),也應(yīng)該如此,如果沒有加鎖,豈不是就容易出現(xiàn)問題。
這一點(diǎn)在《MFC windows程序設(shè)計(jì)》和MSDN文檔上都說過了,雖然出錯(cuò)概率很低,但我們也應(yīng)該規(guī)范編程。

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多