GUI 消息队列(消息泵 - 并行或串行)
GUI message queues (message pump - parallel or series)
我似乎无法在任何地方找到这个问题的答案。我不确定我是否知道如何表达它。
发往表单控件的消息是否相互并行处理?
我的印象一直是我们每个线程单元有一个消息泵,并且一个泵将提供附加到该线程的整个 GUI。因此,如果您在一个控件上连接到 wndproc 并冻结线程 (Thread.Sleep()),那么整个表单会冻结吗?
如果是这样, 似乎可以证明,通过在特定消息到达子控件时休眠,相邻的控件会处理它的下一条消息。怎么样?
消息严格按顺序处理。不要被 Q+A 中的时间戳误导,它只是分数中没有足够的数字来表明消息实际上相隔微秒到达。消息处理程序非常快,这很正常。
只有当您有多个线程时,代码才会并行运行。这对用户界面来说是毒药,大块代码从来都不是线程安全的。即使是小块,非常基本的 .NET 类,如 List<> 也不是。您可以通过使用锁定来保持代码线程安全,这是一种困难的方法,您只能使用小代码才能做到这一点,或者确保它始终在一个特定的线程上运行。
存在消息循环因为UI不是线程安全的。它是 producer-consumer problem 的通用解决方案。操作系统和其他进程中的线程生产,UI线程消耗。
我似乎无法在任何地方找到这个问题的答案。我不确定我是否知道如何表达它。
发往表单控件的消息是否相互并行处理?
我的印象一直是我们每个线程单元有一个消息泵,并且一个泵将提供附加到该线程的整个 GUI。因此,如果您在一个控件上连接到 wndproc 并冻结线程 (Thread.Sleep()),那么整个表单会冻结吗?
如果是这样,
消息严格按顺序处理。不要被 Q+A 中的时间戳误导,它只是分数中没有足够的数字来表明消息实际上相隔微秒到达。消息处理程序非常快,这很正常。
只有当您有多个线程时,代码才会并行运行。这对用户界面来说是毒药,大块代码从来都不是线程安全的。即使是小块,非常基本的 .NET 类,如 List<> 也不是。您可以通过使用锁定来保持代码线程安全,这是一种困难的方法,您只能使用小代码才能做到这一点,或者确保它始终在一个特定的线程上运行。
存在消息循环因为UI不是线程安全的。它是 producer-consumer problem 的通用解决方案。操作系统和其他进程中的线程生产,UI线程消耗。