2009-08-04 75 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的意思是有一個隱藏的「上的消息事件」少一個,這樣的消息將有一個開銷事件+消息傳遞

相關問題