跨线程问题

一、窗口的跨线程问题

 

      

在线程中对窗口进行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就被消除了.

 

总结:

       MFC中,窗口不能跨线程绘制,不能跨线程更新,不能跨线程创建。简单的说,不能跨线程访问MFC窗口对象,MFC句柄封装类只在创建句柄的线程中有效,在其它线程中访问会出现无法预料的结果。

 

     

二、内存的跨线程问题

 

     跨线程delete操作为什么会失败?

     http://topic.csdn.net/u/20090910/11/9c176a9e-c477-45b3-97cf-0186f9f8f7bd.html

 

 

三、跨线程与死锁

 

      一个跨线程创建窗口的死锁案例

      http://blog.titilima.com/createwindow-deadlock.html

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值