Pyqt线程处理应用程序在第二次启动时崩溃

时间:2018-09-06 08:29:10

标签: python-3.x multithreading pyqt5

我制作了一个小型测试应用程序来练习线程-第一次启动时,它运行良好,并且在gui仍在运行时将循环打印到控制台。但是,如果我关闭应用程序,然后再将其打开,则内核崩溃并重新启动。

我以前在pyqt5应用程序中遇到过此问题,通常可以在脚本末尾添加QCoreApplication.instance()部分时解决。我想知道这一次我实现线程的方式是否有错误。

import sys
import time
from PyQt5 import QtWidgets
from PyQt5.QtCore import QObject, QThread, pyqtSignal
from PyQt5.QtCore import QCoreApplication

class Worker(QObject):
    finished = pyqtSignal()

    def __init__(self):
        super(Worker, self).__init__()
        self.working = True

    def work(self):
        while self.working:
            # do stuff here
            print("I'm running")
            time.sleep(1)

        self.finished.emit() # alert our gui that the loop stopped

class Window(QtWidgets.QMainWindow):

    def __init__(self):
        super(Window, self).__init__()
        self.setGeometry(50, 50, 200, 150)
        self.setWindowTitle("Program")

        self.startbtn = QtWidgets.QPushButton("Start", self)
        self.startbtn.resize(self.startbtn.minimumSizeHint())
        self.startbtn.move(50, 50)
        self.stopbtn = QtWidgets.QPushButton("Stop", self)
        self.stopbtn.move(50, 100)
        self.stopbtn.resize(self.stopbtn.minimumSizeHint())

        self.thread = QThread()
        self.worker = Worker()
        self.worker.moveToThread(self.thread)
        self.startbtn.clicked.connect(self.thread.start)  # start the thread when we click the start button
        self.thread.started.connect(self.worker.work)  # begin our worker object's loop
        self.stopbtn.clicked.connect(self.stop_loop)  # stop the loop on the stop button click
        self.worker.finished.connect(self.loop_finished)  # do something in the gui when the worker loop ends

    def stop_loop(self):
        self.worker.working = False

    def loop_finished(self):
        print('Looped Finished')

if __name__ == "__main__":
    app = QCoreApplication.instance()               # Fixes error with kernel crashing on second run of application
    if app is None:                                 # PyQt doesn't like multiple QApplications in the same process, therefore
        app = QtWidgets.QApplication(sys.argv)                # apart from the initial run, the first QApplication instance will run
    window = Window()
    window.show()
    app.exec_()

0 个答案:

没有答案