ASSERT((p
=
pMap
->
LookupPermanent(m_hWnd))
!=
NULL
||
(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(FALSE)的时候,虽然有ASSERT报错,但是结果还是正确的,似乎没有什么影响,不知道这个ASSERT到底意味着什么?
作者分享使用MFC遇到窗口跨线程问题,MFC窗口线程相关,HandleMap存于线程堆栈。文章给出两种修改方案,一是用FromHandle获取CWnd*调用UpdateData,未成功更新界面;二是发消息到UI线程处理,实验成功消除ASSERT。作者对直接在工作线程调用UpdateData报错但结果正确存疑。
1441

被折叠的 条评论
为什么被折叠?



