C++ SendMessage vs PostMessage+;等待线程结束

C++ SendMessage vs PostMessage+;等待线程结束,c++,winapi,sendmessage,postmessage,waitforsingleobject,C++,Winapi,Sendmessage,Postmessage,Waitforsingleobject,我想知道调用SendMessage(哪个块)和结合WaitForSingleObject调用PostMessage有什么区别。 想法?PostMessage和WaitForSingleObject允许您执行异步消息传递。您可以发送消息,做其他事情,稍后再查看回复SendMessage是同步的,需要您等待。我一直认为SendMessage直接调用windows过程,跳过消息队列;而PostMessage只是将消息添加到队列中。SendMessage是单个API调用,因此不太容易出错。使用内置的,而

我想知道调用SendMessage(哪个块)和结合WaitForSingleObject调用PostMessage有什么区别。
想法?

PostMessage
WaitForSingleObject
允许您执行异步消息传递。您可以发送消息,做其他事情,稍后再查看回复
SendMessage
是同步的,需要您等待。

我一直认为SendMessage直接调用windows过程,跳过消息队列;而PostMessage只是将消息添加到队列中。

SendMessage是单个API调用,因此不太容易出错。使用内置的,而不是滚动自己的。

SendMessage()
如果从COM调用的上下文中调用,可能会被拒绝,其中COM对象位于STA中(调用通过消息泵进行调度)
PostMessage()
不受遵守COM单元规则的限制

另外,
PostMessage()
将消息放在窗口消息队列的末尾
SendMessage()
绕过队列。你可以在Raymond Chen的博客上找到关于消息队列的更长的讨论


我的观点是,
SendMessage()
PostMessage()
之间的区别远远超出了人们的想象。我真的建议浏览Raymond的博客,因为多年来他已经介绍了许多gotchas。

我想我应该提到我的目标是实现同步性。我会做PostMessage,然后立即调用WaitForSingleObject。+1用于突出显示主要的操作差异-PostMessage事件并等待它允许调用方继续处理。如果目标是在线程处理的某个后期阶段等待,直到GUI线程中完全处理了之前发布的消息,那么这将非常有用。这取决于从哪个线程调用SendMessage()。线程间调用总是通过泵进行封送,而不是直接发送到winproc。如果需要同步性,请调用SendMessage。这并不是因为它不太容易出错。这些函数具有完全不同的语义目的。您选择使用其中一种,应该基于您希望实现的目标,而不仅仅是如何使代码“工作”。“语义”是针对自然语言的。代码是代码所做的,而不是它应该意味着什么。不,是促进代码可读性、自我文档化和遵守API契约的语义。仅仅因为代码现在做了一些事情并不意味着它将永远继续做同样的事情。仅仅因为实现者知道代码的作用,并不意味着后来的维护者会知道你为什么以一种完全不明显、不直观的方式做了一些事情。“代码就是代码所做的,而不是它应该意味着什么。”这里的主题是“SendMessage”和“PostMessage”,它们是符号名称,具有语义。忽略语义并坚持只考虑实现是程序员可能拥有的最不称职的概念。