2012-05-12 37 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

相關問題