2012-05-12 39 views
1

这是wxPython中的源文件的摘录:为什么它必须是GUI线程的上下文?

""" 
    Create the output window if needed and write the string to it. 
    If not called in the context of the gui thread then uses 
    CallAfter to do the work there. 
    """   

内部是怎样工作的呢?为什么重要的是GUI相关的调用不是由其他线程直接完成的?

你知道一个图表或什么,可以用简单的方法解释这些GUI概念吗?

如果我不需要阅读小说来理解这个问题,那么我就会知道如何选择我的设计。


编辑:

这是低于讨论:

Diagram

+1

没有必要对GUI代码以支持多线程被调用。要做到这一点,需要将各种同步代码添加到GUI框架中。所以几乎所有的GUI框架都坚持只从GUI线程调用它们的客户端。作为框架的客户,为何作出决定几乎是不相关的。就是这样。 –

回答

1

这是相当容易的。想想一个队列,wxPython有它自己的内部事件队列,当你调用MainThread时,你会导致wxPython处理它,你将从Main-Thread调用它。因此,无论何时修改小部件,它都不会干扰正在处理事件队列的MainLoop。但是,当添加线程时,多于一个线程正在操作GUI和/或事件队列和GUI访问不同步。 这就是wx.CallAfter变得有用的地方,它只是向Event-Queue添加一个伪事件,它将调用你指定的函数,所以它将从Main-Thread执行,并且只有一个Thread正在访问GUI。请注意,当您的传递函数需要一段时间才能返回时,GUI将冻结,因为不会再处理更多事件(如移动或点击)。

相关:http://wiki.wxpython.org/LongRunningTasks

+0

“并且GUI访问不同步。” - 你能告诉我为什么没有完成?会是太多的努力还是这样的事情?感谢您的解释btw。 – rynd

+0

对不起,我不能告诉你为什么它不同步没有猜测。如果你想得到答案,你可以在wxPython邮件列表上询问RobinD例如可以回答这个问题。 – dav1d

+0

你的解释对我的理解很有帮助。但不知怎的,我得到了指向我什么都不懂的地方,我想:所以像StaticText.GetLabel这样的方法触发在主循环中处理消息,或者什么?你能澄清一下吗? – rynd

相关问题