1. 程式人生 > >利用CWinThread實現跨線程父子MFC窗口

利用CWinThread實現跨線程父子MFC窗口

erl 能夠 在線 使用 不能 ron cor 環境 通過

利用CWinThread實現跨線程父子MFC窗口

MFC對象只能由創建該對象的線程訪問,而不能由其他線程訪問。

不遵守該準則將導致斷言(assertion)或者無法預知的程序行為等運行期錯誤

在多線程環境中,由於所有的窗口元素都通過線程來管理,於是MFC將暫時/永久窗口<->句柄映射保存在TLS中。其他的窗口句柄映射以及設備描述表也是采用類似的方法存儲。將這些窗口句柄映射存儲在TLS中能夠防止其他線程同時訪問這些數據。

宏ASSERT_VALID的調用在MFC中相當頻繁。這樣,如果你調用該宏來驗證其他線程對象的有效性,就會出現斷言錯誤。就算不出現斷言錯誤,也會導致程序異常退出,這是因為不允許直接操作其他線程中的CWnd對象。

解決的方法是使用窗口句柄而不是MFC對象。在線程之間傳遞窗口句柄是安全的。如果線程A向線程B傳遞一個窗口句柄,那麽,線程B可以通過發送消息給擁有該句柄的窗口對象。在處理窗口消息時,系統已經切換到線程A。這是驗證窗口對象的有效性會成功。

與此同時,線程B能夠調用CWnd::FromHandle()函數來獲得暫時的窗口對象,不過這一對象應該謹慎使用。因為它無法與存在於線程A窗口對象映射中的對象同步。

利用CWinThread實現跨線程父子MFC窗口