2009-12-11 41 views
3

當使用win32事件對象(CreateEvent)或線程窗口消息隊列開發多線程時,性能是否有所不同。兩者都應該使用某種WaitFor ...調用。 我自己的代碼幾乎完全基於事件,但也許我在不使用消息時會丟失一些東西。多線程:事件驅動與消息驅動

回答

4

如果您擔心線程消息和內核事件之間的性能差異,那麼您應該不使用線程消息。

Win32線程消息隊列是最初爲Windows 16開發的機制 - 當沒有線程時。他們已經成長爲處理Win32的線程模型,但在它們的封面下它們是相當複雜的野獸。

這有pro和con的。缺點是,很簡單,它們比其他形式的線程間同步和通信慢,並且有更多的限制。對於初學者來說,因爲許多windows代碼(MessageBox,DoDragDrop等)實現了模態消息循環 - 有很多時候線程消息可能會丟失。重要的是不要使用那些意味着要接收線程消息的線程的API。** 1 *在消息隊列開始刪除消息之前,消息隊列的大小也有限制,並且線程消息API(GetMessage)不會導致線程進入可警告狀態(所以你不能使用QueueUserAPC)。

線程消息的pro' - 只要它們的限制被尊重 - 它們是一個非常可靠的預製輪,可以將調用序列化爲線程。如果你發現自己實現了一個非UI工作線程的排隊機制,爲什麼要重新發明一個經過良好測試的輪子 - 使用預先構建的消息隊列。

** 1 *這包括調試宏的大部分實現,如ASSERT,將彈出一個消息框。