Windows线程间SendMessage产生的死锁问题

SendMessage死锁何时产生呢 ?如果 Thread B 向   Thread A SendMessage一个消息,那么  Thread B 的这个 SendMessage 就要等  Thread A 的队列中的 消息执行完毕才能够返回,如果在 Thread B SendMessage 的同时  Thread A  等待 Thread B 中的某一处理完毕才能够继续处理消息的话, 那么这个时候就发送了死锁
 我们继续以测试来说明:
测试3:    
首先在 CMainFrame中加入一个 成员变量:
m_bThreadExit (Public)    
我们将 UINT ThreadProc(LPVOID lParam) 加入一样代码如下:       

UINT ThreadProc(LPVOID lParam)
{
          CMainFrame * v_pFrameWnd = (CMainFrame *)lParam;
          if(v_pFrameWnd)
          {
              v_pFrameWnd->SendMessage(WM_USER + 100,0,0);
          }
          v_pFrameWnd->m_bThreadExit = TRUE;
          return 0;
}


然后再 OnCreate 当中添加如下代码:
          
          m_bThreadExit = FALSE;
          AfxBeginThread(ThreadProc,this);
           while(TRUE)
          { 
               if(m_bThreadExit)
                  break;
               Sleep(55);
          }


  OK 编译 F5 运行 发现程序 进入无响应状态,好这时我么让程序 暂停:看看 2个Thread 的 Call Stack 都停在那里了?Main Thread如下:

再看看 另一个线程:
这会 是不是 很明了了MainThread  停在 循环内 等待  m_bThreadExit 为 True,而 另一个线成 则等待  MainThread 处理完毕 WM_USER + 100 这个消息,结果你等我,我等你,死了。。。。
处理办法
1.  针对上面的例子 我们 可以通过 把 SendMessage 改成  PostMessage 的方法来放弃等待。 这样就解决了
2.  有些时候 第1种方法不符合要求比如下面这中情况
UINT ThreadProc(LPVOID lParam)
{
          CMainFrame * v_pFrameWnd = (CMainFrame *)lParam;
          if(v_pFrameWnd)
          {
              v_pFrameWnd->SetWindowText("lvyang");
          } 
         v_pFrameWnd->m_bThreadExit = TRUE;
          return 0;
}
这里面的CWnd::SetWindowText里面实际上调用的是
::SetWindowText;
而::SetWindowText 里面有调用  SendMessage 发送一个消息给CWnd 的窗口 ,因为::SetWindowText 内部的我们没有办法来修改,那我只能去修改 MainThread 当中的  While 循环了。 那如何修改呢? ThreadProc 当中 SetWindowText之所以被诸塞,就是因为 它向 MainThread SendMessage 的消息 没有得到处理,那么我们让他处理的不就OK了吗?
好那我们就让他处理,代码如下:
       MSG msg;
       while(TRUE)
       {
          if(m_bThreadExit)
             break;
          if(::PeekMessage(&msg,NULL,NULL,NULL,PM_NOREMOVE))
          {
             if(::GetMessage(&msg,NULL,NULL,NULL))
             {
                if(!PreTranslateMessage(&msg))
                { 
                    ::TranslateMessage(&msg);
                   ::DispatchMessage(&msg);
                }
             }
          }
          Sleep(55);
}


来源: <http://www.cppblog.com/woaidongmao/archive/2008/12/17/69696.html>  
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值