利用CWinThread实现跨线程父子MFC窗口

Posted 2018shawn

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了利用CWinThread实现跨线程父子MFC窗口相关的知识,希望对你有一定的参考价值。

利用CWinThread实现跨线程父子MFC窗口

MFC对象只能由创建该对象的线程访问,而不能由其他线程访问。

不遵守该准则将导致断言(assertion)或者无法预知的程序行为等运行期错误

 

在多线程环境中,由于所有的窗口元素都通过线程来管理,于是MFC将暂时/永久窗口<->句柄映射保存在TLS中。其他的窗口句柄映射以及设备描述表也是采用类似的方法存储。将这些窗口句柄映射存储在TLS中能够防止其他线程同时访问这些数据。

宏ASSERT_VALID的调用在MFC中相当频繁。这样,如果你调用该宏来验证其他线程对象的有效性,就会出现断言错误。就算不出现断言错误,也会导致程序异常退出,这是因为不允许直接操作其他线程中的CWnd对象。

解决的方法是使用窗口句柄而不是MFC对象。在线程之间传递窗口句柄是安全的。如果线程A向线程B传递一个窗口句柄,那么,线程B可以通过发送消息给拥有该句柄的窗口对象。在处理窗口消息时,系统已经切换到线程A。这是验证窗口对象的有效性会成功。

与此同时,线程B能够调用CWnd::FromHandle()函数来获得暂时的窗口对象,不过这一对象应该谨慎使用。因为它无法与存在于线程A窗口对象映射中的对象同步。

以上是关于利用CWinThread实现跨线程父子MFC窗口的主要内容,如果未能解决你的问题,请参考以下文章

MFC_Thread

未调用 MFC 的 CWinThread::PostThreadMessage 处理程序

如何使用 CWinThread 在 MFC 中创建工作线程?

CWinThread 查询 (MFC)

WPF中窗口控件的跨线程调用

MFC 线程 UI 中的帮助