【问题标题】:GUI message queues (message pump - parallel or series)GUI 消息队列(消息泵 - 并行或串行)
【发布时间】:2023-03-27 08:43:01
【问题描述】:

我似乎无法在任何地方找到答案。我不确定我是否知道如何表达它。

发送给表单控件的消息是否彼此并行处理?

我一直认为我们每个线程单元都有一个消息泵,并且一个泵会为附加到该线程的整个 GUI 提供数据。因此,如果您在一个控件上连接到 wndproc 并冻结线程(Thread.Sleep()),整个表单会冻结吗?

如果是这样,this question 似乎证明了当特定消息到达子控件时休眠,相邻控件处理了它的下一条消息。怎么样?

【问题讨论】:

  • 我对底层操作系统的细节并没有那么深入,但这可能取决于你是使用 WinForms 还是 WPF 作为 C# .NET GUI。你能指定吗?
  • 抱歉,问题已更新。

标签: c# winforms windows-messages message-pump


【解决方案1】:

消息严格按顺序处理。不要被那个 Q+A 中的时间戳误导,它只是没有足够的数字来表明消息实际上是相隔微秒到达的。消息处理程序非常快,这很正常。

只有当您有多个线程时,代码才会并行运行。这是对用户界面的毒药,大块代码永远不是线程安全的。即使是小块,非常基本的 .NET 类,如 List 也不是。您可以通过使用锁定来保持代码线程安全,这是一种艰难的方式,并且您只能使用小代码进行尝试,或者确保它始终在一个特定线程上运行。

存在消息循环因为 UI 不是线程安全的。它是producer-consumer problem 的通用解决方案。操作系统和其他进程中的线程产生,UI线程消耗。

【讨论】:

  • 感谢您的回复。这是非常有用的。我可以告诉您,每次将条目添加到阻塞集合时,都会创建这些时间戳,来自同一表单上的各种控制 wndproc 覆盖。我对时间戳并不真正感兴趣,而是对它们进入阻塞集合的 order 感兴趣。似乎(似乎只是错觉)休眠特定消息允许绑定到不同控件的消息首先处理。这纯粹是错觉吗?因为有其他证据支持这一点(一个错误已经消失)
  • 我不会评论我看不到的代码。但可以肯定的是,那里发生了某种错觉。
猜你喜欢
  • 2012-10-17
  • 1970-01-01
  • 2017-09-05
  • 1970-01-01
  • 1970-01-01
  • 2015-01-25
  • 1970-01-01
  • 2013-04-11
  • 1970-01-01
相关资源
最近更新 更多