【问题标题】:Terminate QThread when GUI exitsGUI 退出时终止 QThread
【发布时间】:2019-10-05 05:39:46
【问题描述】:

我正在使用 QThreads 在后台运行一个函数,但是当我退出 GUI 应用程序时,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()

如何在 GUI 关闭时终止 QThread?

【问题讨论】:

  • os.system('EAZ{0}(3,5).EAZ{0}(3,5).OUT'.format(newcase)) 是什么意思? ,如果你想完成线程,你应该完成那个任务。
  • @eyllanesc 它是一个第三方程序。我希望能够在应用程序打开时完成线程,但是如果用户退出整个应用程序,它应该停止线程。有没有办法做到这一点?
  • 正如我已经指出的,这个想法是完成这个过程。

标签: python python-3.x pyqt pyqt5 qthread


【解决方案1】:

我认为在您的情况下,线程只是必要的,因为 os.system() 是阻塞的,但是如果您使用 QProcess 它执行类似的任务并且您不需要线程,它还允许使用 Qt 事件循环更轻松地管理.

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

【讨论】:

  • 如果GUI在主线程上,进程不会冻结GUI吗?我正在使用 QThreads 来保持 GUI 可供用户使用。
  • 您能解释一下为什么使用 pyqtslot 装饰器,因为这些方法在没有它们的情况下也可以工作?另外,如果方法在进程完成时运行,为什么还要保留 self.signalPF35.emit()?
  • @Drees 1) @pyqtSlot() 的使用不是强制性的,但如果它是有益的,请阅读riverbankcomputing.com/static/Docs/PyQt5/… 2) 我仍然发出 signalPF35 因为我不想修改你的逻辑,我愿意不知道你为什么用signalPF35。
  • 由于我试图访问第三方程序,使用 cmd 提示符,您如何使用 QProcess 启动它,如 self._process.start("EAZ {0}(1,1). EAZ {0}(1,1).OUT".format(newcase)) 不起作用
猜你喜欢
  • 2021-01-15
  • 1970-01-01
  • 2010-12-26
  • 1970-01-01
  • 2011-12-17
  • 2013-04-21
  • 2013-11-10
  • 2015-09-08
  • 1970-01-01
相关资源
最近更新 更多