2015-10-16 78 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