pyqt:如何正确退出线程

时间:2016-10-04 21:03:15

标签: python qt python-3.x pyqt pyqt4

我写了一个pyqt gui并使用线程来运行需要很长时间才能执行的代码,但是我想有选择来安全地停止执行。我不想使用get_thread.terminate()方法。我想通过一个特殊的函数(可能是 del ())来停止代码。我的问题是,我在自己的类中编写代码,只是想在不改变大量语法的情况下中止类。

编辑:有人提到必须将一个标志传递给该类,必须不断检查。如何将此标志发送给班级?因为标志必须改变值,当按下停止按钮时。

编辑2:到目前为止,我的解决方案是,使用名称running_global来解除全局变量。我将self.get_thread.terminate()更改为running_global = False,如果变量设置为False,我会在我的long_running_prog中不断检查。我认为这个解决方案很难看,所以如果有人有更好的想法,我会很高兴。

这是我启动主题的对话框的代码:

$./a.out
7 1 4 6 8 9 5 2 3 10 
26
$ ./a.out
7 1 4 6 8 9 5 2 3 10 
41
$ ./a.out
7 1 4 6 8 9 5 2 3 10 
39

在以下类中是线程的代码:

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()

因此,如果按下停止按钮,程序应立即以保存方式关闭。有没有办法以保存的方式中止课程?例如,当按下停止按钮时,我可以将变量传递给long_running_prog类,该类变为True吗?如果有可能这样的话,可以告诉我怎么做?

感谢您的提前帮助

我希望你理解我的问题。 问候 Hizzy

1 个答案:

答案 0 :(得分:0)

除非prog.run(self)定期检查标志的值以突破其循环,否则不可能这样做。实现后,线程上的__del__(self)应设置标志,然后才wait