首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >QThread停止事件处理

QThread停止事件处理
EN

Stack Overflow用户
提问于 2019-02-13 06:36:44
回答 1查看 31关注 0票数 0

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

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

我能做些什么才能让QThread像线程一样工作。我知道我可以添加一些计时器并将其划分为事件,但这不是我所认为的线程。

代码语言:javascript
复制
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_())
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-02-13 06:55:18

QThread不是线程,它是一个线程处理程序。在你的例子中,问题是变量t是局部的,所以在执行start之后它将被删除,此时调用__del__方法,这个方法调用在阻塞图形用户界面的主线程中运行的wait(),这个阻塞它将一直持续到run方法完成执行,所以总之,问题是t是一个局部变量,解决方案是及时地保留它,所以有两种可能: 1)将它作为父对象传递给self,或者2)使它成为类的成员:

代码语言:javascript
复制
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()
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54659713

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档