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