2012-02-22 215 views
1

我有一個小問題與PyQt4的工作和線程包時:蟒蛇線程GUI

我的代碼如下所示:

def goForwardToSamples(self): 
    self.main.dataSet = DataSetProvider(self.main.sourceFile) 
    self.ui = Ui_NeuralPredictor2() 
    self.ui.setupUi(self) 
    ParalelGui(self.ui).start() 
    self.connectSignalsWindow2() 
def connectSignalsWindw2(self): 
    # DOING SOME REAL SERIOUS COMPUTATION ... 

=>現在高清運行(個體經營):在ParalelGui類是什麼樣子這個:

def run(self): 
    self.gui.show() 

=>我只是想測試我的GUI將運行並行計算。

我覺得我知道問題是什麼。我有一個QtableView,充滿了我寫的數據(做了一些真正的嚴重計算..)。那個QtableView當然是我發送給ParalelGui線程顯示的一部分。我真的不知道如何使它工作...基本上我想有一部分GUI線程和已經顯示,而另一部分是在不同的線程動態填充。

現在會發生什麼是典型的「你沒有線程你的GUI凍結」 ......不禁大爲讚賞

+0

什麼是'ParalelGui'?你是否試圖用不同的線程顯示你的GUI?你也使用'QThread'類嗎?我們需要更多的代碼結構。 – jdi 2012-02-23 02:29:23

回答

3

即使你的例子是非常有限的,我要帶刺的什麼,我認爲你正在做這裏...

對我來說,你似乎在做事情倒退,並試圖在主線程中執行大量計算時在線程中顯示你的GUI?

你真的應該做的是在主線程中創建並顯示你的GUI,並在單獨的工作線程中運行繁重的計算。這個工作線程可以在數據準備就緒時發出一個信號,你的主線程可以連接並快速更新你的表。這樣你就不會阻止你的主線程。經驗法則從不在主線程中做任何事情。它的意思是GUI和它的事件。

此外,請確保您使用QThread類而不是python線程模塊。

+0

非常感謝你!那正是我需要知道的......我昨天意識到了這一點(主線程是針對gui的),並以另一種方式修復它(在另一個線程中執行計算,保留主要的gui)。現在我使用線程從線程...我今天晚些時候會嘗試QThread – kosta5 2012-02-23 07:08:02

+0

使用QThread的好處是,它自QObject以來它帶有信號。在run()例程中的任何點添加和發出更多信號是微不足道的。 QThread還支持事件循環,以便在那裏創建gui對象並讓它們能夠接收事件並連接到其他信號。 – jdi 2012-02-23 15:40:24

+0

正確。我的意思是QThread支持事件循環,以便您可以將任何QObject移動到它們並讓它們的事件和信號/插槽在那裏運行。不是QWidgets。 – jdi 2012-02-23 15:49:21