利用CWinThread實現跨執行緒父子MFC視窗

2021-06-21 22:28:51 字數 1569 閱讀 6113

標籤:

mfc物件

mfc視窗跨執行緒

mfc介面執行緒

跨執行緒訪問mfc物件

原始出處 、作者資訊和本宣告。否則將追究法律責任。

原則上,mfc物件只能由建立該物件的執行緒訪問,而不能由其它執行緒訪問.這是因為mfc視窗中有乙個windows handle maps, 這個maps同執行緒相關,也就是說該執行緒一定會訪問該maps,而且該執行緒建立的mfc視窗物件一定會放到該maps中,如果沒有就會報錯.但是如果其它執行緒將乙個視窗物件傳到該執行緒,因為這個視窗沒有在該執行緒maps中,所以就會報錯.但是mfc也給出了跨執行緒訪問mfc視窗物件的辦法,一種辦法就是就是不傳遞視窗物件,而是傳遞視窗控制代碼;另外一種辦法就是在接收視窗控制代碼的執行緒中使用fromhandle構造乙個新的視窗物件並加入maps中.詳細資訊參考 multithreading: programming tips.

下面是示例**.

從cwinthread派生乙個cuithread類,可以利用vs嚮導生成,再新增乙個成員:hwnd m_hparentwnd.

建立乙個對話方塊類cuichilddlg,同樣用vs嚮導生成.

子視窗所在的執行緒.

class

cuithread : 

public

cwinthread 

;

bool

cuiwinthread::initinstance() 

在這個函式中,建立了乙個對話方塊,作為主視窗的子視窗.

注意這個fromhandle的呼叫,他返回乙個cwnd物件.

這樣建立的視窗不會報錯.如果直接將主視窗物件傳遞過來,而不是通過呼叫fromhandle獲取,則呼叫pdlg->create會報錯,在除錯版本中會彈出乙個視窗,指出錯誤位置.

cuichilddlg是利用嚮導隨便寫的乙個對話方塊.注意要過載下面這個函式.

void

cuichilddlg::onncdestroy() 

下面**是

派生類,

主視窗在這個類中建立

.

bool

退出函式實現

.

int

等待函式是必須的

,這是為了等待子視窗執行緒退出後父視窗執行緒再退出.

在測試中發現,關閉主視窗之前只能保證先關閉子視窗,但退出主線程之前並不能保證子視窗執行緒一定會退出,這可能會導致某些資源不能正確釋放,所以這裡要呼叫等待函式,從而保證子視窗執行緒能夠正常退出.

跨執行緒父子視窗的好處是建立子視窗阻塞時不會影響父視窗的執行.例如啟動程式時,建立子視窗過程中由於載入太多內容而阻塞,導致父視窗無法操作,分屬不同執行緒後,父視窗執行不受影響,它仍然可以正常啟動,最大最小化,移動,響應滑鼠訊息等等.

但也不完全是這樣,程式執行起來之後,子視窗也會使用父視窗所在的執行緒訊息迴圈,如果子視窗阻塞,同樣會導致父視窗阻塞.

對於跨執行緒mfc物件使用問題,msdn已經介紹過來,可以參考multithreading with c++ and mfc.

有一位網友介紹的更詳細,參考如何在工作執行緒中建立視窗?.只不過他使用的是工作執行緒,而不是mfc提供的ui執行緒.

利用iframe from表單實現跨域上傳檔案

一 需要的材料 客戶端需要乙個html頁面a其中包含乙個iframe和乙個form表單,乙個頁面b 我稱之為客戶端 裡面包含對返回引數的處理 服務端需要乙個asp.net的一般處理程式用來處理上傳檔案並返回值。二 原理圖 有圖才有真相,哈哈哈 三 客戶端 實現 1 頁面a的實現 開始上傳 2.頁面實...

利用ssh埠對映實現跨網快速訪問

中國的網路的特殊性相信大家都很頭疼,電信使用者訪問網通的速度不怎麼理想,在我這裡基本上相當於撥號的速度,嚴重影響工作的效率。我工作的地方只有電信的線路,如果通過電信的線路登陸網通的伺服器速度相當的慢。在這裡通過ssh的埠對映功能可以實現資料 訪問起來速度非常好。環境 全部都是linux伺服器 ssh...

利用Nginx解決跨域問題

跨域跨域的常見解決方法 nginx解決跨域 反向 正向 和反向 圖示區別 負載均衡 nginx配置 極簡 瀏覽器安全的基石是 同源政策 same origin policy 同源政策指的是 同源政策的目的,是為了保證使用者資訊的安全,防止惡意的 竊取資料。協議,網域名稱,埠號,只要有乙個不同,就會產...