2011-10-28 40 views
3

QThreadクラスではself.terminate()、GUIクラスではself.thread.terminate()を使ってみました。私はまた両方の場合にself.wait()を入れてみました。ただし、次の2つのシナリオが発生します。QThreadをGUIアプリケーションから正しく終了するにはどうすればいいですか?

1)スレッドがまったく終了せず、GUIが停止してスレッドが終了するのを待っています。スレッドが終了すると、GUIはフリーズし、すべて正常に戻ります。

2)スレッドは実際に終了しますが、同時にアプリケーション全体がフリーズします。

self.thread.exit()も試してみました。喜びはありません。

さらに明確にするために、GUIの中にユーザアボートボタンを実装しようとしています。このボタンは、任意の時点でスレッドの実行を終了します。

ありがとうございます。

EDIT:QThreadのためのQtのドキュメントから

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

スレッドを安全に終了させる方法は1つだけです。すべてのタスクを終了させるようにしてください。これを実行するには、ハードタスクを実行する前にthread.terminatedをチェックする必要があります。 – TheHorse

答えて

4

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クラスのメソッドである:ここでは

run()方法です。 :終了:

警告:この機能は危険で、その使用はお勧めしません。 スレッドは、コードパスの任意のポイントで終了できます。スレッドをデータの変更中に に終了することができます。スレッドが の後にクリーンアップしたり、保持されているミューテックスなどをロック解除することはありません。つまり、絶対に必要な場合にのみ を使用してください。

あなたのスレッド戦略を考え直すことは、おそらくもっと良い考えです。 QThread :: quit()を使用して、この方法でスレッドを終了させるのではなく、スレッドが正常終了するように通知します。実際にスレッド内からthread.exit()を呼び出すには、run()の実装方法に応じてスレッドを実行する必要があります。スレッド実行メソッドのコードを共有したいのであれば、なぜ動作しないのかを示唆するかもしれません。

+0

こんにちは、ありがとう。私はポストにコードを追加しました。 –

+0

Hmm。そして、私は 'self.create()'メソッドがスレッドで時間のかかるメソッドであると仮定します。一般的には、 'self.terminated(){do slow operation parts ..}'のようなものがあります。残念ながら、私はPythonをよく知っていませんが、 – docsteer

+1

私も同様にそれを試みた役立つかもしれないスレッドチュートリアル[ここ](http://diotavelli.net/PyQtWiki/Threading,_Signals_and_Slots)のように見えます。多少動作しました(GUIはフリーズしませんが、スレッドは終了しません)。しかし、奇妙なことがちょうど起こった。スレッドの 'def stop(self)'コードとGUIの 'def on_abort_clicked(self)'コードをすべて削除し、書き換えました。私は単に自己を置く。スレッドの 'stop()'関数でterminate()を実行し、GUIクラスで 'self.thread.stop()'を実行しました。それは魅力のように働く。 AFAIK、それは私が試した最初のもので、以前はうまくいかなかった。私はおそらく何かを逃した。 –

関連する問題