Завершить QThread при выходе из GUI - PullRequest
2 голосов
/ 18 мая 2019

Я использую QThreads для запуска функции в фоновом режиме, но когда я выхожу из приложения с графическим интерфейсом, QThread все еще продолжает работать.

Есть примеры использования C ++, но я не знаю, как их реализоватьв python

class PF35Thread(QtCore.QThread):
    signalPF35 = pyqtSignal()
    def __init__(self, parent = None):
        super().__init__(parent)
    def run(self):
        newcase = newcaseList[-1]
        os.system('EAZ{0}(3,5).EAZ{0}(3,5).OUT'.format(newcase))
        self.signalPF35.emit()

Как мне завершить QThread при закрытии GUI?

1 Ответ

1 голос
/ 18 мая 2019

Я думаю, что в вашем случае поток необходим только потому, что os.system () блокирует, но если вы используете QProcess, он выполняет аналогичную задачу, и вам не нужен поток, это также упрощает управление с помощью Qt eventloop .

from PyQt5 import QtCore, QtGui, QtWidgets


class MainWindow(QtWidgets.QMainWindow):
    signalPF35 = QtCore.pyqtSignal()

    def __init__(self, parent=None):
        super(MainWindow, self).__init__(parent)

        button = QtWidgets.QPushButton("Start task", clicked=self.on_clicked)
        self.setCentralWidget(button)
        self._process = QtCore.QProcess(self)
        self._process.finished.connect(self.on_finished)

    @QtCore.pyqtSlot()
    def on_clicked(self):
        newcase = newcaseList[-1]
        self._process.start('EAZ{0}(3,5).EAZ{0}(3,5).OUT'.format(newcase))

    @QtCore.pyqtSlot()
    def on_finished(self):
        self.signalPF35.emit()

    def closeEvent(self, event):
        self._process.kill()
        super(MainWindow, self).closeEvent(event)


if __name__ == "__main__":
    import sys

    app = QtWidgets.QApplication(sys.argv)
    w = MainWindow()
    w.show()
    sys.exit(app.exec_())
...