袁野
摘要:該文通過分析與研究MFC內(nèi)部關(guān)鍵數(shù)據(jù)結(jié)構(gòu),并結(jié)合Windows操作系統(tǒng)UI工作原理,提出了如何解決應(yīng)用程序在多線程環(huán)境下界面的顯示與更新。
關(guān)鍵詞:MFC;線程局部存儲(chǔ);TLS;線程狀態(tài);模塊狀態(tài);模塊-線程狀態(tài);窗口句柄映射表
中圖分類號(hào):TP311 文獻(xiàn)標(biāo)識(shí)碼:A 文章編號(hào):1009-3044(2014)32-7630-02
1 多UI線程顯示工具條的問題與解決
在多線程顯示UI中普遍存在的問題是從當(dāng)前線程的模塊-線程狀態(tài)的永久句柄表或臨時(shí)句柄表中無法查找到另一個(gè)線程對(duì)應(yīng)窗口句柄的MFC窗口類對(duì)象,而MFC類庫和第三方界面庫的界面更新邏輯對(duì)具有父子關(guān)系的窗口均假設(shè)為在同一線程進(jìn)行,因此當(dāng)從主框架開始進(jìn)行消息傳遞來更新界面時(shí),如果某一窗口句柄在當(dāng)前線程的永久句柄表中查找不到MFC窗口對(duì)象時(shí),更新消息不會(huì)傳遞給該窗口,從而造成界面的局部未被更新。
解決此問題的方法是將主線程的模塊-線程狀態(tài)中的句柄表拷貝到子線程的模塊-線程狀態(tài)中的句柄表中。下面以在子線程中彈出一個(gè)工具條為例子加以說明,在線程中彈出一個(gè)工具條的代碼如下:
以上代碼是將主線程的線程-模塊狀態(tài)中的句柄表拷貝到子線程的線程-模塊狀態(tài)中的句柄表時(shí)能正確彈出工具條的樣例代碼。
參考文獻(xiàn):
[1] Charles Petzold.Windows程序設(shè)計(jì)[M]. 5版.北京:北京大學(xué)出版社,1999.
[2] George Shepherd,Scot Wingo.深入解析MFC[M]. 趙劍去,卿瑾,譯.北京:中國電力出版社,2003.
[3] 候捷. 深入淺出MFC[M].武漢:華中科技大學(xué)出版社,2001.
[4] 李久進(jìn).MFC深入淺出[M].武漢:華中科技大學(xué)出版社,1999.
[5] Jeffrey Richter .Windows 核心編程[M].王建華,張煥生,侯麗坤,譯.北京:機(jī)械工業(yè)出版社,2000.
摘要:該文通過分析與研究MFC內(nèi)部關(guān)鍵數(shù)據(jù)結(jié)構(gòu),并結(jié)合Windows操作系統(tǒng)UI工作原理,提出了如何解決應(yīng)用程序在多線程環(huán)境下界面的顯示與更新。
關(guān)鍵詞:MFC;線程局部存儲(chǔ);TLS;線程狀態(tài);模塊狀態(tài);模塊-線程狀態(tài);窗口句柄映射表
中圖分類號(hào):TP311 文獻(xiàn)標(biāo)識(shí)碼:A 文章編號(hào):1009-3044(2014)32-7630-02
1 多UI線程顯示工具條的問題與解決
在多線程顯示UI中普遍存在的問題是從當(dāng)前線程的模塊-線程狀態(tài)的永久句柄表或臨時(shí)句柄表中無法查找到另一個(gè)線程對(duì)應(yīng)窗口句柄的MFC窗口類對(duì)象,而MFC類庫和第三方界面庫的界面更新邏輯對(duì)具有父子關(guān)系的窗口均假設(shè)為在同一線程進(jìn)行,因此當(dāng)從主框架開始進(jìn)行消息傳遞來更新界面時(shí),如果某一窗口句柄在當(dāng)前線程的永久句柄表中查找不到MFC窗口對(duì)象時(shí),更新消息不會(huì)傳遞給該窗口,從而造成界面的局部未被更新。
解決此問題的方法是將主線程的模塊-線程狀態(tài)中的句柄表拷貝到子線程的模塊-線程狀態(tài)中的句柄表中。下面以在子線程中彈出一個(gè)工具條為例子加以說明,在線程中彈出一個(gè)工具條的代碼如下:
以上代碼是將主線程的線程-模塊狀態(tài)中的句柄表拷貝到子線程的線程-模塊狀態(tài)中的句柄表時(shí)能正確彈出工具條的樣例代碼。
參考文獻(xiàn):
[1] Charles Petzold.Windows程序設(shè)計(jì)[M]. 5版.北京:北京大學(xué)出版社,1999.
[2] George Shepherd,Scot Wingo.深入解析MFC[M]. 趙劍去,卿瑾,譯.北京:中國電力出版社,2003.
[3] 候捷. 深入淺出MFC[M].武漢:華中科技大學(xué)出版社,2001.
[4] 李久進(jìn).MFC深入淺出[M].武漢:華中科技大學(xué)出版社,1999.
[5] Jeffrey Richter .Windows 核心編程[M].王建華,張煥生,侯麗坤,譯.北京:機(jī)械工業(yè)出版社,2000.
摘要:該文通過分析與研究MFC內(nèi)部關(guān)鍵數(shù)據(jù)結(jié)構(gòu),并結(jié)合Windows操作系統(tǒng)UI工作原理,提出了如何解決應(yīng)用程序在多線程環(huán)境下界面的顯示與更新。
關(guān)鍵詞:MFC;線程局部存儲(chǔ);TLS;線程狀態(tài);模塊狀態(tài);模塊-線程狀態(tài);窗口句柄映射表
中圖分類號(hào):TP311 文獻(xiàn)標(biāo)識(shí)碼:A 文章編號(hào):1009-3044(2014)32-7630-02
1 多UI線程顯示工具條的問題與解決
在多線程顯示UI中普遍存在的問題是從當(dāng)前線程的模塊-線程狀態(tài)的永久句柄表或臨時(shí)句柄表中無法查找到另一個(gè)線程對(duì)應(yīng)窗口句柄的MFC窗口類對(duì)象,而MFC類庫和第三方界面庫的界面更新邏輯對(duì)具有父子關(guān)系的窗口均假設(shè)為在同一線程進(jìn)行,因此當(dāng)從主框架開始進(jìn)行消息傳遞來更新界面時(shí),如果某一窗口句柄在當(dāng)前線程的永久句柄表中查找不到MFC窗口對(duì)象時(shí),更新消息不會(huì)傳遞給該窗口,從而造成界面的局部未被更新。
解決此問題的方法是將主線程的模塊-線程狀態(tài)中的句柄表拷貝到子線程的模塊-線程狀態(tài)中的句柄表中。下面以在子線程中彈出一個(gè)工具條為例子加以說明,在線程中彈出一個(gè)工具條的代碼如下:
以上代碼是將主線程的線程-模塊狀態(tài)中的句柄表拷貝到子線程的線程-模塊狀態(tài)中的句柄表時(shí)能正確彈出工具條的樣例代碼。
參考文獻(xiàn):
[1] Charles Petzold.Windows程序設(shè)計(jì)[M]. 5版.北京:北京大學(xué)出版社,1999.
[2] George Shepherd,Scot Wingo.深入解析MFC[M]. 趙劍去,卿瑾,譯.北京:中國電力出版社,2003.
[3] 候捷. 深入淺出MFC[M].武漢:華中科技大學(xué)出版社,2001.
[4] 李久進(jìn).MFC深入淺出[M].武漢:華中科技大學(xué)出版社,1999.
[5] Jeffrey Richter .Windows 核心編程[M].王建華,張煥生,侯麗坤,譯.北京:機(jī)械工業(yè)出版社,2000.