2009-08-04 32 views
1

环境:Win32中,C/C++这是更快:SetEvent的话,SendMessage,PostMessage的

所有三(3)可以被用于一个线程发信号给主(),它已经完成了例的动作。

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

嗯......

+0

你的意思是win32方法吗?另外,什么语言? – 2009-08-04 17:59:01

+1

他们做不同的事情。 – 2009-08-04 18:00:11

回答

6

这三个选项需要一个线程上下文切换到实际信号的接收线程。上下文切换的开销很可能会压倒任何API中的处理成本的差异。

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

  • SendMessage是有用的。发送线程将阻塞,直到收件人处理消息。但是在那段时间它可能会处理未排队的消息。该逻辑可能会减慢速度,因为可能会涉及其他上下文切换,使SendMessage成为三者中最慢的。

  • PostMessage也是有用的,当收件人是消息循环的内部。与SendMessage的不同之处在于它不会等待收件人处理邮件,从而导致更少的开销。

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

0

还没有签,但(假设你有一个人在等的对象),我会说SetEvent的,SendMessage函数最后PostMessage的。

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

然而,无论发帖还是发送消息则是通常你会用什么来的信号发送到另一个线程。

2

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

0

如果你看一下MsgWaitForMultipleObjects VS WaitForMultipleObjects的,你会看到,MsgWaitForMultipleObjects最长等待的对象比WaitForMultipleObjects的意思是有一个隐藏的“上的消息事件”少一个,这样的消息将有一个开销事件+消息传递

相关问题