工作线程中调用UI线程创建的窗口的UpdateData会导致Assert的问题及解决办法.
来源:互联网 发布:centos修改时区命令 编辑:程序博客网 时间:2024/06/15 17:18
最近写了个代码,在UI线程中创建了一个窗口,然后在工作线程中修改了这个窗口中的一些数据,然后想用UpdateData(FALSE)来更新窗口的内容,结果在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
(p = pMap->LookupTemporary(m_hWnd)) != NULL);
ASSERT((CWnd*)p == this); // must be us
我用MFC也没有多久,也不太熟悉,翻了翻资料,在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线程里面,这时候可以用来更新界面,实验是成功的,ASSERT就被消除了.
LRESULT CProtectPage::OnUpdateData(WPARAM wParam, LPARAM lParam)
...{
UpdateData(wParam);
return 0;
}
...{
UpdateData(wParam);
return 0;
}
还是有点疑惑,就是刚开始直接在工作线程中调用UpdateData(FALSE)的时候,虽然有ASSERT报错,但是结果还是正确的,似乎没有什么影响,不知道这个ASSERT到底意味着什么?
- 工作线程中调用UI线程创建的窗口的UpdateData会导致Assert的问题及解决办法.
- 工作线程中调用UI线程创建的窗口的UpdateData会导致Assert的问题及解决办法
- 工作线程中调用UI线程创建的窗口的UpdateData会导致Assert的问题及解决办法(ZZ)
- 线程中更新窗口不能直接调用UpdateData函数 的解决办法
- 线程中更新窗口不能直接调用UpdateData函数 的解决办法
- UpdateData在线程中出错的解决办法 .
- (转)UpdateData在线程中出错的解决办法
- 线程中不能用updatedata()的解决办法
- VC++线程中不能用updatedata()的解决办法
- 工作线程中UpdateData
- MFC中使用线程创建窗口的问题
- 子线程中循环操作UI线程时导致子线程无法正常结束的问题总结
- 线程中更新窗口不能直接调用UpdateData函数
- 线程中更新窗口不能直接调用UpdateData函数
- 线程中更新窗口不能直接调用UpdateData函数
- 线程中更新窗口不能直接调用UpdateData函数
- MFC:线程中更新窗口不能直接调用UpdateData函数
- MFC中工作线程的创建
- 呵呵,我来了。。。。
- 在 Linux 下使用数码相机
- Debian 下 Web Server 和浏览器的利用
- Apt-get 边看边记
- Emerald 的搜索引擎使用技巧
- 工作线程中调用UI线程创建的窗口的UpdateData会导致Assert的问题及解决办法.
- Screen 边看边记
- Linux 下触控板的配置
- vi 的一个小技巧──折叠文本
- 实战EdaEagle——个人帐目管理系统(一)
- GCC 中文手册(上)
- GCC 中文手册(中)
- GCC 中文手册(下)
- Soft-ICE实例起步