MFC子線程中更新控件內(nèi)容的兩種辦法

姓名:李振華 學(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]

view plain copy

example1.png

返回值:
成功時(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]

view plain copy

  1. 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]

view plain

copy

example2.png

2.實(shí)現(xiàn)線程函數(shù),使用全局函數(shù)

example3.png

3.在成員函數(shù)OnInitDialog創(chuàng)建線程并啟動(dòng)

[cpp]

view plain

copy

  1. m_pThread = AfxBeginThread((AFX_THREADPROC)ThreadFunction, this);

三丢习、通過發(fā)送自定義消息更新控件內(nèi)容

1.在頭文件中定義消息ID

[cpp]

view plain

copy

  1. define WM_UPDATE_STATIC (WM_USER + 100)

  2. 在對(duì)話框類CThreadDemoDlg中添加成員——線程對(duì)象的指針 和線程函數(shù)

[cpp]

view plain

copy

  1. CWinThread *m_pThread;

  2. static UINT ThreadFunction(LPVOID pParam);

3.聲明自定義的消息函數(shù)

[cpp]

view plain

copy

afx_msg LRESULT OnUpdateStatic(WPARAM wParam, LPARA lParam);

4.在CPP文件中添加消息映射

[cpp]

view plain

copy

example4.png

5.實(shí)現(xiàn)自定義消息響應(yīng)函數(shù)

[cpp]

view plain

copy

example5.png

6.實(shí)現(xiàn)線程函數(shù)牵触,并通過PostMessage發(fā)送自定義消息

[cpp]

view plain

copy

example6.png

7.在成員函數(shù)OnInitDialog創(chuàng)建線程并啟動(dòng)

[cpp]
m_pThread = AfxBeginThread((AFX_THREADPROC)ThreadFunction, this);

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市咐低,隨后出現(xiàn)的幾起案子揽思,更是在濱河造成了極大的恐慌,老刑警劉巖见擦,帶你破解...
    沈念sama閱讀 206,839評(píng)論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件钉汗,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡锡宋,警方通過查閱死者的電腦和手機(jī)儡湾,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,543評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來执俩,“玉大人徐钠,你說我怎么就攤上這事∫凼祝” “怎么了尝丐?”我有些...
    開封第一講書人閱讀 153,116評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)衡奥。 經(jīng)常有香客問我爹袁,道長(zhǎng),這世上最難降的妖魔是什么矮固? 我笑而不...
    開封第一講書人閱讀 55,371評(píng)論 1 279
  • 正文 為了忘掉前任失息,我火速辦了婚禮譬淳,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘盹兢。我一直安慰自己邻梆,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,384評(píng)論 5 374
  • 文/花漫 我一把揭開白布绎秒。 她就那樣靜靜地躺著浦妄,像睡著了一般。 火紅的嫁衣襯著肌膚如雪见芹。 梳的紋絲不亂的頭發(fā)上剂娄,一...
    開封第一講書人閱讀 49,111評(píng)論 1 285
  • 那天,我揣著相機(jī)與錄音玄呛,去河邊找鬼阅懦。 笑死,一個(gè)胖子當(dāng)著我的面吹牛徘铝,可吹牛的內(nèi)容都是我干的故黑。 我是一名探鬼主播,決...
    沈念sama閱讀 38,416評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼庭砍,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼场晶!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起怠缸,我...
    開封第一講書人閱讀 37,053評(píng)論 0 259
  • 序言:老撾萬榮一對(duì)情侶失蹤诗轻,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后揭北,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體扳炬,經(jīng)...
    沈念sama閱讀 43,558評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,007評(píng)論 2 325
  • 正文 我和宋清朗相戀三年搔体,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了恨樟。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,117評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡疚俱,死狀恐怖劝术,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情呆奕,我是刑警寧澤养晋,帶...
    沈念sama閱讀 33,756評(píng)論 4 324
  • 正文 年R本政府宣布,位于F島的核電站梁钾,受9級(jí)特大地震影響绳泉,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜姆泻,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,324評(píng)論 3 307
  • 文/蒙蒙 一零酪、第九天 我趴在偏房一處隱蔽的房頂上張望冒嫡。 院中可真熱鬧,春花似錦四苇、人聲如沸灯谣。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,315評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至峻呛,卻和暖如春罗售,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背钩述。 一陣腳步聲響...
    開封第一講書人閱讀 31,539評(píng)論 1 262
  • 我被黑心中介騙來泰國(guó)打工寨躁, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人牙勘。 一個(gè)月前我還...
    沈念sama閱讀 45,578評(píng)論 2 355
  • 正文 我出身青樓职恳,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親方面。 傳聞我的和親對(duì)象是個(gè)殘疾皇子放钦,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,877評(píng)論 2 345