【问题标题】:SendMessage and PostMessage which one is better to use?SendMessage 和 PostMessage 哪个更好用?
【发布时间】:2013-09-02 19:58:29
【问题描述】:

在网上搜索这两个函数调用之间的区别,我发现:

这两个 API 调用之间的区别在于它们将控制权返回给调用应用程序的方式。使用 SendMessage 控件不会返回给调用应用程序,直到消息发送到的窗口完成处理发送的消息,但是使用 PostMessage 控件将返回给调用应用程序立即,无论天气如何,发送的消息是否已被处理。

postMessage:在与线程关联的消息队列中发送一条消息,并在不等待线程处理该消息的情况下返回。

SendMessage:调用指定窗口的窗口过程,直到窗口过程处理完消息才返回。

PostMessage 是一个异步函数,而 SendMessage 是一个同步函数。

现在的问题是我的应用程序(需要高性能)使用哪个功能更好?

请注意,我在 Visual Studio 2010 中使用 MFC,并且对于此代码:

CWnd *pParentOfClass = CWnd::GetParent();
pParentOfClass ->  

我只有这些发送消息的功能:

  • PostMessageW

  • 发送消息

  • SendMessageW

更多问题:
你能告诉我SendMessage和SendMessageW的区别吗?

【问题讨论】:

  • 这取决于你想发送什么消息——你能举一些例子吗?
  • 好吧,它需要更多解释。我很快就会编辑我的问题。请参阅编辑部分。谢谢@EdwardClements
  • 请不要在同一个帖子中问两个问题。
  • 我赞成这个问题,因为它包含我想要的关于这两个 API 的所有信息

标签: visual-studio-2010 performance mfc message-queue sendmessage


【解决方案1】:

您实际上已经通过描述 SendMessage 和 PostMessage 回答了您自己的问题。

SendMessage:发送消息并等待,直到负责消息的过程完成并返回。

PostMessage: 将消息发送到消息队列并立即返回。但是您不知道该消息何时实际被处理。因此,如果您应该期望从该处理过的消息中得到答案,那么您很可能也会通过消息得到它。

这真的取决于使用哪一个,但最终结果几乎相同,只是时间问题。此外,PostMessage 在多线程应用程序中特别有用,它允许您通过线程创建的窗口在线程之间安全地进行通信。

以 A 或 W 结尾的 PostMessage 或 SendMessage 只是指示如何解释字符串,即分别是单字节或多字节。没有 A 或 W 结尾的是预处理器宏,将委托给您的应用程序设置的任何内容。

【讨论】:

  • 你能解释一下这部分吗? 没有 A 或 W 结尾的是预处理器宏,将委托给您的应用程序设置的任何内容。
  • 不应该太重要,只使用通用的(即没有特殊的结尾)。请参阅ANSI/Unicode in WinAPI 了解更多信息。
  • 事实上@no_seriously,我从您的回答中了解到,如果我希望处理程序返回一个值并根据该值执行我的处理,我应该使用 SendMessage 但主要问题是哪个性能更好.你的部分回答说只是时间问题你能再解释一下吗?
  • 好吧,严格来说,我会说 SendMessage “更快”,因为它不必通过消息队列并立即得到处理。 PostMessage 延迟处理,直到消息发布之前队列中的消息被处理。因此,为了使其简单且令人满意,SendMessage 更快。但是,在谈论高性能时,这不应该是主要关注点,这完全取决于您要归档的确切内容。
  • @sepideh 如果您要比较两个执行不同操作的 API 调用之间的性能比较,那么您做错了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-30
  • 1970-01-01
相关资源
最近更新 更多