请问高手PostMessage和SendMessage的区别 请问高手什么时候该用PostMessage,什么时候该用SendMessage。还有在什么情况下需要用::PostMessage,什么时候需要用::SendMessage?希望能特别针对多线程的程序进行一下举例说明。不甚感激。 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 在多线程里用PostMessage比较好,区别MSDN上已经说的很清楚了 SendMessage函数用于向窗口发送消息。与PostMessage不同,SendMessage函数是一个同步函数。直到接收窗口的窗口过程对消息进行处理后,函数才返回。 当需要某个窗口过程立即执行一项任务时,通常发送一条消息。SendMessage函数将消息直接发送给接收窗口的窗口过程。SendMessage函数等到窗口过程完成消息处理后才返回消息结果。父窗口和子窗口常以互相发送消息的方式进行通信。例如:一个以编辑控件为子窗口的父窗口,可以通过向子窗口发送消息来设置控件的文本。控件也可以向父窗口发送消息,以通知父窗口用户对文本的改变。 如果接收线程与发送线程相同,则SendMessage函数就直接调用窗口过程,如果接收线程与发送线程不同,则两个消息队列就对消息传递进行同步。发送线程一直等到接收线程对消息处理后才能继续执行。如果接收线程不在执行消息循环,则它就不会对消息进行处理。因而,如果向不在执行消息循环的线程发送了一条消息,则发送线程将停止响应。 PostMessage发送消息,不等消息处理完成立刻返回SendMessage发送消息,等消息完成才返回如:work_thread 中{...char buf[MAX_PATH];...SendMessage(m_MainWnd, WM_MYMSG, (DWORD)buf, 0);...}主程序中CMainFrame::OnMyMsg(WPARAM wParam, LPARAM lParam){ char *p = (char *)wParam; AfxMessageBox(p);}以上例子中就只能用SendMessage,如果用PostMessage,由于PostMessage立刻返回, buf不再有效,等主程序处理消息的时候再访问buf就会出错,但如果将buf定义为全局变量,用PostMessage 就是可以的。 区别:postMessage发出消息后,向消息放到消息队列中,该函数结束.SendMessage发出消息后,一直等到该消息执行完毕,才返回。 PostMessage进消息队列SendMessage不进消息队列如果用SendMessage发送消息不能用窗口类的PreTranslateMessage()截获该消息 如果消息参数里面有局部指针,非要用SendMessage。如果只包含数值而且对返回的值不感兴趣,可以用PostMessage。SendMessage为同步函数,只能用于本县城,而PostMessage比较复杂,它实际上调用PostThreadMessage。还涉及进程通讯的问题。 SendMessage为同步函数,只能用于本县城>>不同意,我现在的多线程程序里。使用SendMessage()效果好。因为使用PostMessage()的话,主线程(接受消息的线程)的消息队列接受了太多的消息,来不及处理。阻塞掉了 PostMessage()是向消息队列中发送一个消息SendMessage()是发送并且处理一个消息 sendmessage()发的消息,程序必须马上处理,不用排队啊。而postmessage()发的消息则要在消息队列中排队,等候处理。 Sendmessage可以看成是直接调用窗口程序 SendMessage是插队,PostMessage是排队 SendMessage是要等待消息执行完的返回,而PostMessage是则把消息扔进队列后直接返回。 PostMessage是所谓的异步函数;它负责将相应的消息放入目标线程的注册消息队列中。只用当目标线程处于闲置时才会依次处理改消息队列;而SendMessage使用的是同步机制;它相当于直接调用了目标线程所建立窗口的窗口函数;详情请参加《Windows核心编程》“窗口”一章 应用DSHOW捕捉摄像的问题 提一个小问题 希望大家教教我 今天向mm表白被拒了,郁闷,散分! 报文解析思路? 关于打开数据库得到数据集的时候速度优化问题? 如阿在MSDN中快速找到我想要的例子? 请问有哪位大虾写过关于ARX的Dll。 有没有卖关于用VC编写钩子程序的书?想系统地学学。 关于表格控件的问题?? richedit控件在win10下获得焦点的时候会假死10几秒? 小弟正在学习深入浅出mfc和vc++技术内幕应拿什么题练练手 有关unicode的问题
SendMessage发送消息,等消息完成才返回如:
work_thread 中
{
...
char buf[MAX_PATH];
...
SendMessage(m_MainWnd, WM_MYMSG, (DWORD)buf, 0);
...
}主程序中
CMainFrame::OnMyMsg(WPARAM wParam, LPARAM lParam)
{
char *p = (char *)wParam;
AfxMessageBox(p);
}以上例子中就只能用SendMessage,如果用PostMessage,由于PostMessage立刻返回, buf不再有效,等主程序处理消息的时候再访问buf就会出错,但如果将buf定义为全局变量,用PostMessage 就是可以的。
postMessage发出消息后,向消息放到消息队列中,该函数结束.
SendMessage发出消息后,一直等到该消息执行完毕,才返回。
SendMessage不进消息队列
如果用SendMessage发送消息不能用窗口类的PreTranslateMessage()截获该消息
使用SendMessage()效果好。因为使用PostMessage()的话,主线程(接受消息的线程)的消息队列接受了
太多的消息,来不及处理。
阻塞掉了
SendMessage()是发送并且处理一个消息
而postmessage()发的消息则要在消息队列中排队,等候处理。
而SendMessage使用的是同步机制;它相当于直接调用了目标线程所建立窗口的窗口函数;
详情请参加《Windows核心编程》“窗口”一章