QThread停止事件处理

问题描述 投票:0回答:1

我想用PyQt启动一个Thread,它独立于应用程序的其余部分执行一些操作。这包括运行外部程序。这可能需要几分钟时间。

我的问题是使用QThread停止整个应用程序。运行此小程序时,单击该按钮将冻结应用程序10秒钟。

我该怎么做才能使QThread表现为线程。我知道我可以添加一些定时器并将其划分为事件,但这不是我对线程的想法。

import sys
from PyQt5.QtWidgets import QApplication, QWidget, QPushButton
from PyQt5.QtCore import QThread

class ProgramThread(QThread):
    def __init__(self):
        QThread.__init__(self)

    def __del__(self):
        self.wait()

    def run(self):
        QThread.sleep(10)

class App(QWidget):
    def __init__(self):
        super().__init__()
        thread = QPushButton('Start Thread',self)
        thread.clicked.connect(self.startthread)
        thread.move(20,100)
        self.show()

    def startthread(self):
        t = ProgramThread()
        t.start()

if __name__ == '__main__':
    app = QApplication(sys.argv)
    ex = App()
    sys.exit(app.exec_())
python pyqt pyqt5
1个回答
1
投票

QThread不是一个线程,它是一个线程处理程序。在你的情况下,问题是变量t是本地的,因此它将在执行启动后被删除,此时调用__del__方法,并且这调用wait()在主线程中运行阻塞GUI,这将阻塞它直到run方法完成执行,所以总的来说问题是t是一个局部变量,解决方案是保持它及时,所以有两种可能性:1)将其作为父母传递给self或2)使其成为一个成员班级:

class ProgramThread(QThread):
    def run(self):
        QThread.sleep(10)

    def __del__(self):
        self.wait()

class App(QWidget):
    def __init__(self):
        super().__init__()
        thread = QPushButton('Start Thread',self)
        thread.clicked.connect(self.startthread)
        thread.move(20,100)
        self.show()

    def startthread(self):
        # method 1
        t = ProgramThread(self)
        t.start()
        # method 2
        # self.t = ProgramThread()
        # self.t.start()
© www.soinside.com 2019 - 2024. All rights reserved.