线程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)这句就死了。并没有进入窗口过程(我在窗口过程入口设置了断点)。是怎么回事?或则说有什么调试手段什么工具,可以查出来。
麻烦先回答第一个问题,再回答第二个问题。
会发生什么事情?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)这句就死了。并没有进入窗口过程(我在窗口过程入口设置了断点)。是怎么回事?或则说有什么调试手段什么工具,可以查出来。
麻烦先回答第一个问题,再回答第二个问题。
解决方案 »
- 初学者问一个问题。。怎么设置开始进入的界面
- VC的窗口滚动条,我想给它加上颜色或进行绘图,以达到一种美观的效果,怎么搞?
- 想入门MFC,该如何学呢?
- [求助]在主框架控制栏内用代码添加了一个CEditCtrl,实现当在编辑框控件内回车时,把编辑框CEditCtrl内的字符传出,并赋给一个变量!请多
- 文件映射MapViewOfFile()使用问题
- 请问 我想在vc下练习简单的c++程序,并且想在屏幕上输出结果,怎么做?
- 到现在还无人能解决,如何用程序检测网络是否连通
- VC++6.0 OPENGL动画实现方法!急求!
- 在同一个线程中可否同时相应两个消息
- 如何让窗口启动时隐藏
- 在win32中,能否用mfc的消息映射?
- **分割word文档的问题,有点难度哦
会发生什么事情?Thread_B是不是就被Thread_A阻塞了?
==============================
SendMessage是一个同步的函数,但是你上面写的是不是有问题,Thread_B发消息给Wnd_B,这不是自己发给自己吗?
如果是在Thread_B中发消息给A线程的窗口,那么只有A线程处理完这个消息后,SendMessage才会返回,Thread_B线程才会继续下去.
还有你需要了解SendMessage和PostMessage的工作机制
================
这个很容易理解啊,MessageBox是一个模态对话框,不关闭的话,线程就会停在那儿,不会继续下去,而SendMessage必须要等到发送的消息被处理完之后才会返回,所以只要关闭了MessageBox这个消息才算处理完了,SendMessage也才会返回.
把Message 的HWND设为NULL就ok了
不过你的wnd_b如果没有处理MessageBox线程Thread_A是不会往下执行的,SendMessage也就一直等待Thread_A的返回,Thread_B也就不往下执行了.要调多线程,可以用写logo文件的方式.等运行完了再查看logo文件.
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发消息给线程,那结果就是白忙了。至于楼主说的死锁问题,应该是并不存在的,如果出现了问题,不妨去检查一下自己代码方面的原因
不好意思。
Wnd_B应该改为Wnd_A。大家误会了。。
不好意思。
Wnd_B应该改为Wnd_A。大家误会了。。
==============
也就是说,你是在B里向A用SendMessage吧,而A响应消息时弹出了MessageBox,像上面说的,SendMessage必须等到消息处理完才能返回,而MessageBox不关闭的话,消息处理函数又不能返回,所以B也就阻塞在SendMessage那个地方了.