PostMessage和SeddMessage的区别就是前者马上返回,后者等消息执行完了再返回,但我对消息执行完了这个概念不太清楚!比如:
消息响应函数为A,在A中又调用B,在B中又调用了C,那么SendMessage函数是不是要等B,C都执行完了,最后返回A,再等A执行完了才返回呢?
我有一个线程,它不停的接收数据到自己的缓存,再通信父窗口处理,如果SendMessage函数会像上面那样返回的话,就不用对缓存互斥了,因为实际上他们是顺序执行。
消息响应函数为A,在A中又调用B,在B中又调用了C,那么SendMessage函数是不是要等B,C都执行完了,最后返回A,再等A执行完了才返回呢?
我有一个线程,它不停的接收数据到自己的缓存,再通信父窗口处理,如果SendMessage函数会像上面那样返回的话,就不用对缓存互斥了,因为实际上他们是顺序执行。
那样岂不是PP了
SendMessage仅仅保证消息发到,不保证消息处理完毕!
用汇编的观点看,Invoke后马上就执行下一句
SENDMESSAGE当然要等待消息处理完后才回返回。
halfdream(哈欠)我试了在同一线程中、同一进程中、不同进程中,效果都如steedhorse(晨星)所说,你们懂吗?前两种情况不用说,下面是我在不同进程中的调试代码:
HWND hWnd = ::FindWindow(0, "WebClient");
::SendMessage(hWnd, WM_APP + 1, 0, 0);
Beep(1500, 100);在WM_APP + 1消息的处理函数(另个一个应用程序)中加个延时函数Beep,或者干脆弹出一个对话框MessageBox,结果Beep(1500, 100);这条语句都会被延时。
是不是要等B函数也都执行完毕?
我测试了一下,好像是的哎!测试用例:
void CSendMessageDlg::OnButton1()
{
SendMessage(WM_COMMAND,IDC_BUTTON2,0);
MessageBox("Button1");
}void CSendMessageDlg::OnButton2()
{
OnButton3(); //调用了另外的函数
MessageBox("Button2");
}void CSendMessageDlg::OnButton3()
{
MessageBox("Button3");
}
最终弹出对话框的顺序是:
Button3 -> Button2 -> Button1
楼上各位有何高见?