2015-10-16 76 views
3

我似乎無法在任何地方找到答案。我不確定我是否知道如何說出它。GUI消息隊列(消息泵 - 並行或串行)

不要註定消息控件上的表單處理中彼此平行?

我一直的印象是,我們有每個線程的公寓一個消息泵下,和一個泵會養活連接到該線程整個GUI。所以,如果你在一個控件上掛接了wndproc並凍結了線程(Thread.Sleep()),整個窗體就會凍結?

如果是這樣,會出現this question通過當在子控制的特定消息到達睡覺來證明,相鄰的控制處理它的下一個消息。怎麼樣?

+0

我不是深入到底層操作系統的細節,但它可能取決於如果您使用的WinForms或WPF爲您的C#.NET GUI。你能指定嗎? – ZoolWay

+0

道歉,問題更新。 – user1830285

回答

3

郵件嚴格按照順序處理。不要被該Q + A中的時間戳誤導,它只是沒有足夠的數字來表明消息實際上是以微秒爲單位到達的。消息處理程序非常快,這很正常。

代碼,當你有多個線程並行永遠只能運行。這對用戶界面是有害的,大量代碼永遠不會線程安全。即使是小塊,非常基本的.NET類(例如列表<>)也不是。通過使用鎖定,難以實施的方法以及您只有使用小代碼才能實現的功能,或通過確保它始終運行在特定的線程上,您可以保持代碼的線程安全。

消息循環存在因爲 UI不是線程安全的。這是producer-consumer problem的通用解決方案。 UI線程會消耗操作系統和其他進程中的線程。

+0

感謝您的回覆。這是非常豐富的。我可以告訴你,每次將一個條目添加到阻塞集合時,都會創建這些時間戳,這些時間戳來自同一表單上的各種控制wndproc覆蓋。我對時間戳並不是很感興趣,但是他們到達阻止集合的_order_。它似乎(似乎只是幻覺)睡覺一個特定的消息允許一個消息被綁定到一個不同的控件上,以便首先處理。這是純粹的幻覺嗎?因爲還有其他證據支持這個(一個錯誤已經消失) – user1830285

+2

我不會評論我看不到的代碼。但是,當然,在那裏會出現某種幻覺。 –

+0

好的,謝謝漢斯。 – user1830285