同一窗口上有多个UI线程

luv*_*ere 3 user-interface multithreading thread-safety

我不想要多个窗口,每个窗口都有自己的UI线程,也不需要在单个UI线程上引发事件,而不是后台工作者和通知,也不需要那些Invoke,BeginInvoke.

  • 我对允许多个线程以安全方式更新同一窗口的平台感兴趣.类似于第一个线程的东西会创建三个按钮,第二个线程会创建另外五个按钮,它们都可以访问它们,更改它们的属性并删除它们而不会产生任何不必要
  • 我希望在没有调用的情况下对UI进行安全的多线程访问,这是一个可以直接从任何线程访问UI对象而不会引发错误的平台,例如"只能从创建它的线程访问对象".如果必须的话,让我进行同步,而不是阻止我以直接的方式交叉访问UI.

def*_*ode 16

我要投票但是...... Go Go Gadget Soapbox.

在一般情况下,多线程GUI是不可能的.它一次又一次地被尝试,它永远不会出现.所有主要窗口框架都遵循单线程ui模型并非巧合.他们没有互相抄袭,只是问题的限制导致他们得到同样的答案.很多人比你更聪明,或者我试图解决这个问题.

可能可以为特定项目实现多线程ui.我只是说在一般情况下不能这样做.这意味着你不太可能找到一个框架去做你想做的事情.

问题的关键是这个.将gui组件设想为链(实际上它更像是树,但链很容易描述).按钮连接到框架,连接到框,连接到窗口.系统/操作系统和用户有两个事件来源.系统/ OS事件起源于链的底部(窗口系统),用户事件起源于链的顶部(按钮).这两个事件都必须穿过gui链.如果两个线程同时推送这些事件,则它们必须受互斥保护.但是,没有已知的算法可以在两个方向上同时遍历双链表.它很容易死锁.GUI专家尝试并试图找出解决死锁问题的方法,最终得出了我们今天使用的称为模型/视图/控制器的解决方案,也就是一个线程运行UI.


mbe*_*ish 7

您可以创建一个线程安全的Producer/Consumer队列代理.任何想要更新UI组件的线程都会创建一个封装要执行的操作的委托,并将其添加到qeueue中.UI线程(假设所有组件都在同一个线程上创建)然后定期从队列中提取项目,并执行委托.