使用 SendMessage 和 PostMessage 哪一个更好?

19

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

这两个API调用之间的区别在于它们返回控制权给调用应用程序的方式。通过 SendMessage ,只有在接收到消息的窗口处理完发送的消息后才会将控制权返回给调用应用程序,然而使用 PostMessage 时,无论发送的消息是否被处理,控制权都会立即返回给调用应用程序。

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

SendMessage:调用指定窗口的窗口过程,并在窗口过程处理消息后才返回。

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

现在问题在于我的应用程序(需要高性能)应该使用哪个函数?

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

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

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

  • PostMessageW

  • SendMessage

  • SendMessageW

更多问题:
你能告诉我 SendMessageSendMessageW 之间的区别吗?


1
这取决于你想发送什么样的消息-- 你能给一些例子吗? - Edward Clements
1
需要更多的解释。我很快会编辑我的问题。请查看编辑部分。谢谢@EdwardClements - Sepideh Abadpour
1
请不要在同一篇帖子中提出两个问题。 - Jabberwocky
1
我点赞了这个问题,因为它包含了我想要了解的关于这两个API的所有信息。 - Broken_Window
1个回答

22

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

SendMessage:发送消息并等待负责处理该消息的过程完成并返回。

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

实际使用哪个取决于情况,但最终结果几乎相同,只是时间不同。此外,PostMessage在多线程应用程序中特别有用,可以通过它们创建的窗口安全地在线程之间通信。

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


您能否对这部分进行更详细的解释呢?没有"A"或"W"结尾的是预处理器宏,将委托给您的应用程序设置。 - Sepideh Abadpour
不应该太重要,只需使用通用的(即没有特殊结尾的)即可。有关更多信息,请参见WinAPI中的ANSI / Unicode - bcause
事实上@no_seriously,我从你的回答中理解到,如果我希望处理程序返回一个值并根据该值进行处理,那么我应该使用SendMessage,但主要问题是哪个性能更好。你回答中的一部分说这只是关于时间,你能再解释一下吗? - Sepideh Abadpour
2
严格来说,我会说SendMessage更“快”,因为它不必经过消息队列,可以立即处理。PostMessage会延迟处理,直到在发布消息之前排队的消息被处理。所以简单而言,SendMessage更快。但再次强调,在谈论高性能时,这不应该是主要关注点,一切取决于您想要实现什么。 - bcause
5
如果你正在询问两个API调用之间的性能比较,而这两个调用执行不同的任务,那么你的做法是错误的。 - IInspectable

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