线程Thread_A创建了窗口Wnd_B,并把Wnd_B给了Thread_B。然后在Thread_B里调用SendMessage(Wnd_B,xx,xx,xx);
会发生什么事情?Thread_B是不是就被Thread_A阻塞了?如果Wnd_B的窗口过程做与Thread_A无关的事情,那么应该可以正常通过,如果Wnd_B窗口过程做与Thread_A有关的事情,那么会死锁。如果是PostMessage(Wnd_B,xx,xx,xx),那么不会有死锁问题。1、是这样吗?(是?否?)2、然后我现在遇到一个奇怪的问题是,在Thread_B里SendMessage(Wnd_B,xx,xx,xx),我在Wnd_B窗口过程只是MessageBox一下,别的什么都没做。但是在线程Thread_B里SendMessage(Wnd_B,xx,xx,xx)的时候就死在了那里。 死在那里的意思是SendMessage(Wnd_B,xx,xx,xx)这句就死了。并没有进入窗口过程(我在窗口过程入口设置了断点)。是怎么回事?或则说有什么调试手段什么工具,可以查出来。
麻烦先回答第一个问题,再回答第二个问题。

解决方案 »

  1.   

    线程Thread_A创建了窗口Wnd_B,并把Wnd_B给了Thread_B。然后在Thread_B里调用SendMessage(Wnd_B,xx,xx,xx);
    会发生什么事情?Thread_B是不是就被Thread_A阻塞了?
    ==============================
    SendMessage是一个同步的函数,但是你上面写的是不是有问题,Thread_B发消息给Wnd_B,这不是自己发给自己吗?
    如果是在Thread_B中发消息给A线程的窗口,那么只有A线程处理完这个消息后,SendMessage才会返回,Thread_B线程才会继续下去.
      

  2.   

    你可以理解成一个窗口给另一个窗口发消息
    还有你需要了解SendMessage和PostMessage的工作机制
      

  3.   

    然后我现在遇到一个奇怪的问题是,在Thread_B里SendMessage(Wnd_B,xx,xx,xx),我在Wnd_B窗口过程只是MessageBox一下,别的什么都没做。但是在线程Thread_B里SendMessage(Wnd_B,xx,xx,xx)的时候就死在了那里。 死在那里的意思是SendMessage(Wnd_B,xx,xx,xx)这句就死了。并没有进入窗口过程(我在窗口过程入口设置了断点)。是怎么回事?
    ================
    这个很容易理解啊,MessageBox是一个模态对话框,不关闭的话,线程就会停在那儿,不会继续下去,而SendMessage必须要等到发送的消息被处理完之后才会返回,所以只要关闭了MessageBox这个消息才算处理完了,SendMessage也才会返回.
      

  4.   


    把Message 的HWND设为NULL就ok了
      

  5.   

    断点只能单步调试,多线程当然不行了.
    不过你的wnd_b如果没有处理MessageBox线程Thread_A是不会往下执行的,SendMessage也就一直等待Thread_A的返回,Thread_B也就不往下执行了.要调多线程,可以用写logo文件的方式.等运行完了再查看logo文件.
      

  6.   

    SendMessage死锁发生在两个线程之间。如果Thread_A创建了一个Window_A,当Thread_B使用SendMessage(Window_A,UM_MSg,0,0);发送一条UM_MSg消息到Window_A,因为使用的是SendMessage,所以不将此消息并不放到Thread_A的消息队列,而是直接调用Thread_A的窗口过程,而Thread_B就要等待Thread_A处理完这条UM_MSg消息才会返回。如果这个时候Thread_A也利用SendMessage发送一条消息到Thread_B的话,那么Thread_A也必须等待Thread_B处理完这条消息才会继续往下执行,但是当时Thread_B也在等待Thread_A的处理结果,那么这个时候死锁就发生了。
      

  7.   

    用一下PostThreadMessage看看呢,不过原理差不多,不阻塞式的
      

  8.   

    Wnd_B在Thread_A里创建的,Thread_B发消息给Wnd_B,应该是发给Thread_A的吧?
      

  9.   

    需要注意的是,PostMessage,SendMessage,PostThreadMessage这3个函数是不同的
    PostMessage,SendMessage是基于类CWinApp的成员函数,PostThreadMessage是基于CWinThread(底层基类是CCmdTarget)首先说PostMessage和SendMessage的区别,一个是直接返回,一个是等到待处理的消息从队列中取出后返回(似乎是MFC深入浅出中说的,有点忘记了)。
    还有一个区别,就是当调用这两个函数的线程,也是消息处理函数拥有者线程的情况下,SendMessage还要继续处理消息循环,直到期望的消息被处理到为止。所以,即使是窗口的创建者线程,调用SendMessage也不必担心会死锁。再说PostThreadMessage,这个函数和PostMessage是不同的,千万不能混为一谈
    PostThreadMessage是向UI线程投递消息,消息的响应函数格式是:
    afx_msg void (CWinThread::*)(WPARAM , LPARAM)而PostMessage是向一个CWnd的窗口类发消息,消息的响应函数格式:
    afx_msg LRESULT (CWnd::*)(WPARAM , LPARAM)对于采用线程创建一个窗口(比如对话框)的场合,你可以使用SendMessage向对话框发消息,也可以使用PostThreadMessage向线程发消息,不过需要分清楚,发送的目标对象是不同的:
    SendMessage,形如:
    CDialog * pdlg = ...;
    pdlg->SendMessage(...)
    PostThreadMessage,形如:
    CWinThread pthread = ...
    pthread->PostMessage(...)如果分不清楚PostThreadMessage和SendMessage的区别,一个可能的现象是:期望的消息处理函数没有响应到,比如你在CDialog中定义了消息映射,但是却使用PostThreadMessage发消息给线程,那结果就是白忙了。至于楼主说的死锁问题,应该是并不存在的,如果出现了问题,不妨去检查一下自己代码方面的原因
      

  10.   

    命名错误
    不好意思。
    Wnd_B应该改为Wnd_A。大家误会了。。
      

  11.   

    相办法获取窗口句柄就行了,如果不是在同一个模块,最好定义一个接口,如SetHwnd(..)
      

  12.   

    命名错误
    不好意思。
    Wnd_B应该改为Wnd_A。大家误会了。。
    ==============
    也就是说,你是在B里向A用SendMessage吧,而A响应消息时弹出了MessageBox,像上面说的,SendMessage必须等到消息处理完才能返回,而MessageBox不关闭的话,消息处理函数又不能返回,所以B也就阻塞在SendMessage那个地方了.