2011-10-28 96 views
3

我嘗試在QThread類中使用self.terminate(),並在GUI類中使用self.thread.terminate()。我也嘗試在兩種情況下都使用self.wait()。但是,有兩種情況發生:如何從GUI應用程序正確終止QThread?

1)線程根本不終止,GUI凍結等待線程完成。一旦線程結束,GUI解凍並且一切恢復正常。

2)該線程確實終止,但同時它凍結了整個應用程序。

我也試過使用self.thread.exit()。沒有快樂。

爲了進一步闡明,我試圖在GUI中實現一個用戶中止按鈕,該按鈕可以在任何時間點終止線程的執行。

在此先感謝。

編輯:

這裏是run()方法:

def run(self): 
    if self.create: 
     print "calling create f" 
     self.emit(SIGNAL("disableCreate(bool)")) 
     self.create(self.password, self.email) 
     self.stop()    
     self.emit(SIGNAL("finished(bool)"), self.completed) 

def stop(self): 
    #Tried the following, one by one (and all together too, I was desperate): 
    self.terminate() 
    self.quit() 
    self.exit() 
    self.stopped = True 
    self.terminated = True 
    #Neither works 

這裏是中止線程的GUI類的方法:

def on_abort_clicked(self): 
    self.thread = threadmodule.Thread() 
    #Tried the following, also one by one and altogether: 
    self.thread.exit() 
    self.thread.wait() 
    self.thread.quit() 
    self.thread.terminate() 
    #Again, none work 
+0

注意:self.terminate ===(self.terminated = true),僅此而已。對於所有實現的99%。 – TheHorse

+0

謝謝,但這並不能真正幫助解決問題。 –

+0

只有一種方法可以安全地終止線程 - 讓它完成所有任務。要執行它,你必須在執行艱鉅任務之前檢查thread.terminated。 – TheHorse

回答

4

從Qt的文檔的QThread: :終止:

警告:此功能是危險的,它的使用是不鼓勵的。 線程可以在其代碼路徑中的任意點終止。線程可以在修改數據時終止 。線程沒有機會自己清理後,解鎖任何持有的互斥體等。總之,只有在絕對必要時才使用 這個函數。

重新思考你的線程策略可能是一個好得多的想法,使用QThread :: quit()來指示線程乾淨地退出,而不是試圖讓線程以這種方式終止。實際上,從線程內調用thread.exit()應該這樣做,具體取決於你如何實現run()。如果你想分享你的線程運行方法的代碼,可能暗示爲什麼它不起作用。

+0

嗨,謝謝。我在帖子中添加了代碼。 –

+0

嗯。我假設'self.create()'方法是線程中耗時的方法?一般來說,你會在那裏做的事情就像'while not self.terminated(){做慢操作部分..}'。不幸的是,我不太瞭解Python,但看起來像有一個線程教程[這裏](http://diotavelli.net/PyQtWiki/Threading,_Signals_and_Slots),可能有幫助 – docsteer

+1

我也嘗試過。它碰巧有點工作(GUI不會凍結,但線程也不會終止)。然而最奇怪的事情發生了。我刪除了線程中的所有'def stop(self)'代碼和GUI中的'def on_abort_clicked(self)'代碼,並重寫了它。我只是把自己。在線程的stop()函數中終止()'並在GUI類中執行'self.thread.stop()'。它像一個魅力。 AFAIK,這是我嘗試的第一件事,而且以前沒用。我可能錯過了什麼。 –