SendMessage与PostMessage + WaitForSingleObject的区别

11
我在想调用 SendMessage(阻塞式)与调用 PostMessage 结合 WaitForSingleObject(等待单个对象)有什么区别。您有什么想法吗?

1
如果您想要同步,请调用 SendMessage。 - David Heffernan
4个回答

19
如果您在COM调用的上下文中调用SendMessage(),而COM对象位于STA(调用通过消息泵分派)中,则可能会被拒绝。PostMessage()不受限于遵守COM公寓规则。
此外,PostMessage()将消息放置在窗口消息队列的末尾。 SendMessage()绕过消息队列。您可以在Raymond Chen的博客The Old New Thing中找到有关消息队列的更长讨论。
我的观点是,SendMessage()PostMessage()之间的区别不止表面看起来那么简单。我真的建议阅读Raymond的博客,因为他多年来已经涵盖了许多陷阱。

4

PostMessageWaitForSingleObject 允许您进行异步消息传递。您可以发送一条消息,做其他事情,并稍后检查回复。SendMessage 是同步的,需要等待。


我猜我应该提到我的目标是实现同步。我会使用PostMessage,紧接着立即调用WaitForSingleObject。 - Filip Frącz
将事件通过PostMessage发送并等待响应,使调用者能够继续处理。如果目标是在线程处理的某个较后阶段等待,直到在GUI线程中完全处理了先前发布的消息,则这将非常有用。+1强调主要操作差异。 - Martin James

3
我一直认为SendMessage会直接调用你的窗口过程(window procedure),跳过消息队列;而PostMessage只是将消息添加到队列中。

3
这取决于SendMessage()从哪个线程调用。线程间调用总是通过消息队列传递,而不是直接派发到WinProc。 - Jörgen Sigvardsson

2

SendMessage是一个单一的API调用,因此更不容易出错。建议使用内置的而不是自己编写。


3
它不仅仅是更少出错的问题。这些函数提供非常不同的语义目的。你选择使用其中之一应该基于你想要完成的任务,而不仅仅是如何让这段代码“运行”。 - Cody Gray
“语义”是用于自然语言的。代码是代码所做的事情,而不是它应该意味着什么。 - Seva Alekseyev
1
不,语义是为了促进代码可读性、自我文档化和遵守 API 合同而存在的。仅仅因为代码现在能够做某些事情,并不意味着它将永远继续做同样的事情。而且,仅仅因为实现者知道代码的作用,并不意味着后来的维护者会知道为什么你以一种完全不明显、不直观的方式做了某些事情。 - Cody Gray
4
代码的价值在于其功能,而非它原本被设计用来表达什么。这里讨论的主题是“SendMessage”和“PostMessage”,它们是象征性的名称,具有语义含义。忽视语义,只考虑实现方式是一个程序员可能持有的最不称职的想法。 - Jim Balter

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接