【问题标题】:SendMessage vs PostMessage + WaitForSingleObjectSendMessage 与 PostMessage + WaitForSingleObject
【发布时间】:2011-07-21 16:22:21
【问题描述】:

我想知道调用 SendMessage(哪个阻塞)和调用 PostMessage 与 WaitForSingleObject 有什么区别。 想法?

【问题讨论】:

  • 如果你想要同步调用SendMessage。

标签: c++ winapi sendmessage postmessage waitforsingleobject


【解决方案1】:

SendMessage() 可能会被拒绝,如果您从 COM 调用的上下文中调用它,其中 COM 对象位于 STA 中(调用通过消息泵调度)。 PostMessage() 不限于遵守 COM 公寓规则。

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

我的观点是,SendMessage()PostMessage() 之间的区别远不止表面所见。我真的建议您阅读 Raymond 的博客,因为这些年来他介绍了许多问题。

【讨论】:

    【解决方案2】:

    PostMessageWaitForSingleObject 允许您进行异步消息传递。您可以发送消息、执行其他操作,然后稍后再查看回复。 SendMessage 是同步的,需要你等待。

    【讨论】:

    • 我想我应该提到我的目标是实现同步。我会做 PostMessage 并立即调用 WaitForSingleObject。
    • +1 用于突出主要的操作差异 - PostMessaging 一个事件并等待它允许调用者继续处理。如果目标是在线程处理的稍后阶段等待,直到先前发布的消息在 GUI 线程中完全处理完,这将很有用。
    【解决方案3】:

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

    【讨论】:

    • 这取决于从哪个线程调用 SendMessage()。线程间调用总是通过泵进行编组,而不是直接分派到 winproc。
    【解决方案4】:

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

    【讨论】:

    • 并不是说它更不容易出错。这些函数服务于一个非常不同的语义目的。您选择使用其中一个或另一个应基于您希望完成的任务,而不仅仅是我如何使此代码“工作”。
    • “语义”适用于自然语言。代码是代码的作用,而不是它应该表达的意思。
    • 不,语义用于促进代码可读性、自文档化和遵守 API 合同。仅仅因为代码现在做某事并不意味着它会一直继续做同样的事情。并且仅仅因为实现者知道代码做了什么并不意味着后来的维护者会知道你为什么以一种完全不明显、不直观的方式做某事。
    • “代码是代码做什么,而不是它应该是什么意思” 这里的主题是“SendMessage”和“PostMessage”,它们是符号名称,具有语义。忽略语义并坚持只考虑实现是程序员可能拥有的最不称职的概念。
    猜你喜欢
    • 1970-01-01
    • 2013-09-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多