2016-09-20 7 views
1

処理が完了したスレッドを終了しようとしています。私はmoveToThreadを使用しています。私はスロット内でself.thread.quit()を呼び出すことによって、メインスレッドからワーカースレッドを終了しようとしています。それは機能していません。moveToThreadを使用しているときに、PyQt5でQThreadを正しく終了する方法

私は、このようなmoveToThreadを使用してスレッドを開始するいくつかの例を見出しました。しかし、私は1つを終了する方法を見つけることができません。

from PyQt5.QtCore import QObject, QThread 
from PyQt5.QtCore import pyqtSlot, pyqtSignal 
from PyQt5.QtWidgets import QMainWindow 

class MainWindow(QMainWindow): 
    def __init__(self): 
     super().__init__() 
     print("Base init") 
     self.start_thread() 

    @pyqtSlot(int) 
    def onFinished(self, i): 
     print("Base caught finished, {}".format(i)) 
     self.thread.quit() 
     print('Tried to quit thread, is the thread still running?') 
     print(self.thread.isRunning()) 

    def start_thread(self): 
     self.thread = QThread() 
     self.w = Worker() 
     self.w.finished1[int].connect(self.onFinished) 
     self.w.moveToThread(self.thread) 
     self.thread.started.connect(self.w.work) 
     self.thread.start() 

class Worker(QObject): 
    finished1 = pyqtSignal(int) 

    def __init__(self): 
     super().__init__() 
     print("Worker init") 

    def work(self): 
     print("Worker work") 
     self.finished1.emit(42) 


if __name__ == "__main__": 
    import sys 
    from PyQt5.QtWidgets import QApplication 

    app = QApplication(sys.argv) 
    mw = MainWindow() 
    mw.show() 

sys.exit(app.exec_()) 

これはすべて私の印刷機能(当然の色なし)から出力されます:

Base init 
Worker init 
Worker work 
Base caught finished, 42 
Tried to quit thread, is the thread still running? 
True 

答えて

0

は、スクリプトを複数回実行してみてください。 self.thread.isRunning()への呼び出しの結果は常に同じですか?スレッドがまだ実行中かどうかを確認する前に、time.sleep(1)への呼び出しを追加してみてください。違いがありますか?

プログラムのメインスレッドから別のスレッド(定義上は非同期)にコールしていることに注意してください。あなたのプログラムは、次の命令を実行する前にself.thread.quit()が完了したことを確認するのを待つことはありません。

+0

ありがとうございます!あなたが正しいです。結局のところ、スレッドは終了していました。 print(self.thread.isRunning())はFalseを示します。time.sleep(1)を追加した後、 – squirtgun

関連する問題