姓名:李振華 學(xué)號(hào):17101223418
【嵌牛導(dǎo)讀】:每個(gè)系統(tǒng)中都有線程(至少都有一個(gè)主線程),而線程最重要的作用就是并行處理,提高軟件的并發(fā)率纸颜。針對(duì)界面來說性雄,還能提高界面的響應(yīng)能力。一般的戳晌,為了應(yīng)用的穩(wěn)定性,在數(shù)據(jù)處理等耗時(shí)操作會(huì)單獨(dú)在一個(gè)線程中運(yùn)行痴柔,而所有與主UI線程有關(guān)的控件數(shù)據(jù)刷新應(yīng)該到主UI線程中處理沦偎。也就是數(shù)據(jù)處理線程發(fā)消息,讓界面UI去更新控件。
【嵌牛鼻子】:在MFC中線程分為界面線程和工作者線程豪嚎,界面實(shí)際就是一個(gè)線程畫出來的東西搔驼,這個(gè)線程維護(hù)一個(gè)“消息隊(duì)列”,“消息隊(duì)列”也是界面線程和工作者線程的最大區(qū)別侈询,這個(gè)詞應(yīng)該進(jìn)到你的腦子里舌涨,根深蒂固的!
【嵌牛提問】:如何利用MFC的子線程更新控件的值妄荔?
【嵌牛正文】:
轉(zhuǎn)載:http://blog.csdn.net/dezhihuang/article/details/73499998?locationNum=6&fps=1
一泼菌、概述
MFC中有兩類線程,分別稱之為工作者線程和用戶界面線程啦租。二者的主要區(qū)別在于工作者線程沒有消息循環(huán)哗伯,而用戶界面線程有自己的消息隊(duì)列和消息循環(huán)。在MFC中篷角,一般用全局函數(shù)AfxBeginThread()來創(chuàng)建并初始化一個(gè)線程(工作者線程焊刹,還有一個(gè)重載形式是用于創(chuàng)建用戶界面線程)的運(yùn)行。函數(shù)原型:
[cpp]
返回值:
成功時(shí)返回一個(gè)指向新線程的線程對(duì)象的 指針 恳蹲,否則NULL虐块。
pfnThreadProc:線程的入口函數(shù),聲明一定要如下:UINT MyThreadFunction(LPVOID pParam)嘉蕾,不能設(shè)置為NULL贺奠。如果是類成員函數(shù),一定要是靜態(tài)成員函數(shù)错忱。
pParam:傳遞入線程的參數(shù)儡率,注意它的類型為:LPVOID,所以我們可以傳遞一個(gè) 結(jié)構(gòu)體 或者類對(duì)象到線程以清。一般傳遞this指針儿普,以方便調(diào)用類的非靜態(tài)成員,因?yàn)榫€程函數(shù)是靜態(tài)函數(shù)掷倔。
nPriority:線程的優(yōu)先級(jí)眉孩,一般設(shè)置為0,讓它和 主線程 具有共同的優(yōu)先級(jí)勒葱。
nStackSize:指定新創(chuàng)建的線程的棧的大小浪汪。如果為0,新創(chuàng)建的線程具有和主線程一樣的大小的棧凛虽。
dwCreateFlags:指定創(chuàng)建線程以后死遭,線程有怎么樣的標(biāo)志∩可以指定兩個(gè)值:CREATE_SUSPENDED:線程創(chuàng)建以后殃姓,會(huì)處于掛起狀態(tài) ,直到調(diào)用:ResumeThread瓦阐。0 :創(chuàng)建線程后就開始運(yùn)行蜗侈。
lpSecurityAttrs:指向一個(gè)SECURITY_ATTRIBUTES的 結(jié)構(gòu)體 ,用它來標(biāo)志新創(chuàng)建線程的安全性睡蟋。如果為NULL踏幻,那么新創(chuàng)建的線程就具有和主線程 一樣的安全性。
常見用法:
[cpp]
- AfxBeginThread(MyThreadFunction, this );
傳遞線程參數(shù)為this戳杀,即類本身该面,是為了能在線程函數(shù)中獲得類中非靜態(tài)成員變量,因?yàn)榫€程函數(shù)是靜態(tài)函數(shù)信卡。
MFC子線程中更新控件內(nèi)容有兩種方法隔缀,一種是在子線程中通過全局函數(shù)更新控件內(nèi)容,一種是在子線程中通過發(fā)送自定義消息來更新控件內(nèi)容傍菇。
二猾瘸、通過全局函數(shù)更新控件內(nèi)容
1.在對(duì)話框類CThreadDemoDlg中添加成員變量——線程對(duì)象的 指針 和線程函數(shù)
[cpp]
2.實(shí)現(xiàn)線程函數(shù),使用全局函數(shù)
3.在成員函數(shù)OnInitDialog創(chuàng)建線程并啟動(dòng)
[cpp]
- m_pThread = AfxBeginThread((AFX_THREADPROC)ThreadFunction, this);
三丢习、通過發(fā)送自定義消息更新控件內(nèi)容
1.在頭文件中定義消息ID
[cpp]
define WM_UPDATE_STATIC (WM_USER + 100)
在對(duì)話框類CThreadDemoDlg中添加成員——線程對(duì)象的指針 和線程函數(shù)
[cpp]
CWinThread *m_pThread;
static UINT ThreadFunction(LPVOID pParam);
3.聲明自定義的消息函數(shù)
[cpp]
afx_msg LRESULT OnUpdateStatic(WPARAM wParam, LPARA lParam);
4.在CPP文件中添加消息映射
[cpp]
5.實(shí)現(xiàn)自定義消息響應(yīng)函數(shù)
[cpp]
6.實(shí)現(xiàn)線程函數(shù)牵触,并通過PostMessage發(fā)送自定義消息
[cpp]
7.在成員函數(shù)OnInitDialog創(chuàng)建線程并啟動(dòng)
[cpp]
m_pThread = AfxBeginThread((AFX_THREADPROC)ThreadFunction, this);