2016-10-04 7 views
0

pyqt guiを書き、実行に長時間かかるコードを実行するためにスレッドを使用しましたが、実行を安全に停止する選択肢があります。私はget_thread.terminate()メソッドを使いたくない。私は特別な関数(おそらくデル())によってコードを停止したいと思います。私の問題は、自分のクラスにコードを書いていて、多くの構文を変更することなくクラスを中止したいだけだということです。pyqt:スレッドを正しく終了するには

編集:クラスにフラグを渡す必要があります。このフラグは常にチェックする必要があります。この旗をクラスに送るにはどうしたらいいですか?フラグは停止ボタンを押すと、値を変更する必要があるためです。

編集2:これまでの私の解決策は、名前がrunning_globalのグローバル変数を無効にすることです。 self.get_thread.terminate()をrunning_global = Falseに変更し、変数がFalseに設定されていれば、私はlong_running_progで絶えずチェックします。私はこの解決策は醜いと思うので、誰かがより良いアイデアを持っていれば、私はかなり幸せになれるでしょう。

これは私がスレッドを開始ダイアログの私のコードです:次のクラスで

class SomeDialog(QtGui.QDialog, 
    userinterface_status.Ui_status_window): 
    finished = QtCore.pyqtSignal(bool) 

    def __init__(self): 
     """ 
     :param raster: Coordinates which are going to be scanned. 
     """ 
     super(self.__class__, self).__init__() # old version, used in python 2. 
     self.setupUi(self) # It sets up layout and widgets that are defined 
     self.get_thread = SomeThread() 

     # Conencting the buttons 
     self.start_button.clicked.connect(self.start) 
     self.stop_button.clicked.connect(self.stop) 
     self.close_button.clicked.connect(self.return_main) 

     # Connecting other signals 
     self.connect(self.get_thread, QtCore.SIGNAL("stop()"), self.stop) 
     self.connect(self.get_thread, QtCore.SIGNAL("update_status_bar()"), self.update_status_bar) 

    def return_main(self): 
     """ 
     Function is excecuted, when close button is clicked. 
     """ 
     print("return main") 
     self.get_thread.terminate() 
     self.close() 

    def start(self): 
     """ 
     Starts the thread, which means that the run method of the thread is started. 
     """ 
     self.start_button.setEnabled(False) 
     self.get_thread.start() 

    def stop(self): 
     print("Stop programm.") 
     self.start_button.setEnabled(True) 
     self.get_thread.quit() 

    def end(self): 
     QtGui.QMessageBox.information(self, "Done!", "Programm finished") 



    def closeEvent(self, event): 
     """ 
     This method is called, when the window is closed and will send a signal to the main window to activaete the 
     window again. 
     :param event: 
     """ 
     self.finished.emit(True) 
     # close window 
     event.accept() 

は、スレッドのコードです:

class SomeThread(QtCore.QThread): 
    finished = QtCore.pyqtSignal(bool) 

    def __init__(self): 
     QtCore.QThread.__init__(self) 

    def __del__(self): 
     print("del") 
     self.wait() 

    def run(self): 
     self.prog = long_running_prog(self.emit) # Sending from the prog signals 
     self.prog.run() 
     self.prog.closeSystem() # Leaving the programm in a safe way. 

だから、1機の場合ストップボタンを押すと、プログラムは即座に節電モードでシャットダウンするはずです。クラスをセーブする方法はありますか?例えば、私は変数をlong_running_progクラスに渡すことができます。これは、停止ボタンが押されたときにTrueに変わりますか?もしこのようなものが可能なら、どのように教えてくれるでしょうか?事前

であなたの助けのための

おかげで私はあなたが私の問題を理解してほしいです。 Greetings Hizzy

+0

[QThreadをGUIアプリケーションから正しく終了させるにはどうすればいいですか?](http://stackoverflow.com/questions/7928044/how-to-properly-terminate-a-qthread-from-a-gui-アプリケーション) –

+0

私はこの質問と答えを読んだが、それは私を助けなかった。 – Hizzy

答えて

0

prog.run(self)が定期的にそのループから抜け出すフラグの値を検査しないと、これは実行できません。一度実装すると、スレッドの__del__(self)はフラグを設定し、その後はwaitに設定する必要があります。

+0

さて、私は速く実装すると思います。いくつかのサンプルコードを書いていただけますか?ご協力いただきありがとうございます。 – Hizzy

関連する問題