哪个更快:SetEvent,SendMessage,PostMessage

时间:2009-08-04 17:57:22

标签: c winapi sendmessage postmessage

环境:Win32,C / C ++

所有三(3)个都可以用于线程向main()发信号表明它已经完成了一个操作。

但哪一个是所有人中最快的信号?

嗯...

4 个答案:

答案 0 :(得分:6)

所有三个选项都需要一个线程上下文切换来实际发出接收线程的信号。上下文切换的开销很可能会超过任何API中处理成本的任何差异。

选择可能最好由接收线程的性质驱动,例如它是一个UI线程,和/或它是否执行消息循环。也就是说,一些细节包括:

    当接收线程是一个UI线程时,
  • SendMessage很有用,在消息循环内进行搅拌。发送线程将阻塞,直到收件人处理该消息。但它可能会在此期间处理未列明的消息。这种逻辑可能会降低速度,因为可能涉及额外的上下文切换,使SendMessage成为三者中最慢的。

  • 当收件人在消息循环中时,
  • PostMessage也很有用。与SendMessage的不同之处在于它不会等待收件人处理消息,从而减少了开销。

  • 当接收线程可以等待事件对象时,
  • SetEvent很有用,例如与WaitForSingleObject()。它不会产生编组或消息处理开销,并且可能比其他人响应更快。

答案 1 :(得分:2)

SetEvent是迄今为止最快且最简单的,但它也可以携带最少的信息。基本上它可以说是发生了一些事情(事件被发出信号)。

答案 2 :(得分:0)

没有检查但是(假设你有人在等待对象)我会说SetEvent,SendMessage,最后是PostMessage。

编辑:上面的原因仅仅是SendMessage是同步的,PostMessage是异步的。我不确定SetEvent但我会假设它触发等待事件的事情,而不必等待消息泵传递消息。考虑发送或发布可能无关紧要,这只是发送方是否会等待的问题。内部处理可能完全相同。

但是,发布和发送消息通常都不是用来向另一个线程发送信号的。

答案 3 :(得分:0)

如果你看一下MsgWaitForMultipleObjects和WaitForMultipleObjects,你会发现MsgWaitForMultipleObjects的最大等待对象比WaitForMultipleObjects少一个,这意味着有一个隐藏的“on message event”,所以一条消息将有一个事件的开销+消息通过