GUI消息队列(消息泵-并行或串联)
本文关键字:消息 并行 队列 GUI | 更新日期: 2023-09-27 18:18:08
我似乎找不到这个问题的答案。我不确定我是否知道如何表达它。
发送给窗体控件的消息是否彼此并行处理?
我一直有这样的印象:每个线程单元有一个消息泵,一个消息泵将为该线程附加的整个GUI提供信息。因此,如果您在一个控件上连接到windproc并冻结线程(thread . sleep()),那么整个窗体将冻结?
如果是这样,这个问题似乎证明,当一个特定的消息到达子控件时,通过休眠,相邻的控件处理它的下一个消息。如何?
消息严格按顺序处理。不要被Q+A中的时间戳所误导,它只是在分数中没有足够的数字来显示消息实际上相隔几微秒到达。消息处理程序非常快,这很正常。
只有当你有多个线程时,代码才会并行运行。这对用户界面是有害的,大块代码从来都不是线程安全的。即使是很小的块,非常基本的。net类(如List<>)也不是。你可以通过使用锁来保证代码的线程安全,这是一种艰难的方式,你只能在小代码中尝试一下,或者通过确保它总是运行在一个特定的线程上。
消息循环存在因为 UI不是线程安全的。这是解决生产者-消费者问题的通用方法。线程在操作系统和其他进程中产生,UI线程消耗。