打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
MFC中多线程问题更新对话框内容

在线程中对窗口进行UpdateData(TRUE)来更新窗口的内容,结果在Debug版本下面就出现了Assert报错,说出错地方是wincore.cpp的888行和889行,就是这两句

  ASSERT((p = pMap->LookupPermanent(m_hWnd)) != NULL ||

   (p = pMap->LookupTemporary(m_hWnd)) != NULL);

  ASSERT((CWnd*)p == this);   // must be us

    在http://support.microsoft.com/default.aspx?scid=kb;en-us;147578说MFC窗口跨线程的问题的,大概意思就是MFC的窗口是线程相关的,每个窗口的HandleMap是储存在线程相关的堆栈里面的(thread-local-storage (TLS) ),那这样我就理解了为什么上面两句ASSERT会出错了,线程环境都切换了当然线程堆栈的数据也就不一样了.

    这篇文章提供了两种修改方案:

    一种是用FromHandle来获得一个CWnd*,然后再调用UpdateData,这个方案我没有实验成功,结果是错虽然不报了,但是界面也没有被更新.

    另外一种是通过发消息的方法转到UI线程去处理.可以在窗口映射一个消息,比如ON_MESSAGE(WM_UPDATEDATA, OnUpdateData),然后用SendMessage(WM_UPDATEDATA, FALSE)传消息给窗口,窗口的消息处理肯定是在UI线程里面,这时候可以用

LRESULT CProtectPage::OnUpdateData(WPARAM wParam, LPARAM lParam)

{

 UpdateData(wParam);

 return 0;

}

来更新界面,实验是成功的,ASSERT就被消除了.

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
线程中使用UpdateData出错解决方法(转)
编译成release版本与debug版本的程序有何执行上的区别? VC/MFC / 基础类...
子类化和超类化区别(转自--眼见为实(2):介绍Windows的窗口、消息、子类化和超类化...
深度解析VC中的消息传递机制
钩子技术
在MFC中从一个线程工作函数中向窗口发送消息(this指针的妙用) ---不好用呢
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服