首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >PySide2线程崩溃

PySide2线程崩溃
EN

Stack Overflow用户
提问于 2019-11-01 08:43:16
回答 2查看 545关注 0票数 2

我想使用PySide2 Qtcore.Qthread是因为Qtcore.Signal,但是我最终得到了这样的错误:用退出代码-1073740791完成的进程

代码语言:javascript
复制
from PySide2.QtCore import QThread


class Thread(QThread):
    def run(self):
        print('task started')
        k = 0
        for i in range(10000):
            for j in range(5000):
                k += 1
        print('task finished')

Thread().start()

希望有这些打印,但我有以下错误:

进程已完成退出代码-1073740791

更新:

那么,为什么这段代码也抛出相同的错误呢?

代码语言:javascript
复制
class Thread(QThread):
    done = Signal()

    def __init__(self):
        super(Thread, self).__init__()

    def run(self):
        print('task started')
        k = 0
        for i in range(10000):
            for j in range(5000):
                k += 1
        print('task finished')
        self.done.emit()

class Widget(QtWidgets.QWidget):
    def __init__(self):
        super(Widget, self).__init__()
        btn = QtWidgets.QPushButton('test', parent=self)
        btn.clicked.connect(self.clicked)
        btn.show()

    def clicked(self):
        t = Thread()
        t.done.connect(self.done)
        t.start()

    def done(self):
        print('done')

app = QtWidgets.QApplication()
window = Widget()
window.show()
sys.exit(app.exec_())
EN

回答 2

Stack Overflow用户

发布于 2019-11-01 09:00:59

解释

如果在CMD/终端中运行代码,将得到以下错误:

代码语言:javascript
复制
QThread: Destroyed while thread is still running
Aborted (core dumped)

导致错误的原因是线程在运行时被破坏,因为它是一个局部变量,另一方面,QThread需要一个事件循环来运行。

解决方案

代码语言:javascript
复制
import sys
from PySide2.QtCore import QCoreApplication, QThread


class Thread(QThread):
    def run(self):
        print("task started")
        k = 0
        for i in range(10000):
            for j in range(5000):
                k += 1
        print("task finished")


if __name__ == "__main__":
    # create event loop
    app = QCoreApplication(sys.argv)

    th = Thread()
    th.start()

    th.finished.connect(QCoreApplication.quit)
    sys.exit(app.exec_())

更新:

"t“是一个局部变量,在执行单击后将被删除,导致与初始代码相同的问题,解决方案是防止它立即被销毁,为此有两个选项:

  • 创建"t“类属性

代码语言:javascript
复制
def clicked(self):
    self.t = Thread()
    self.t.done.connect(self.done)
    self.t.start()

  • 将QThread存储在生命周期较长的容器中:

代码语言:javascript
复制
class Widget(QtWidgets.QWidget):
    def __init__(self):
        super(Widget, self).__init__()
        btn = QtWidgets.QPushButton('test', parent=self)
        btn.clicked.connect(self.clicked)

        self.container = []

    def clicked(self):
        t = Thread()
        t.done.connect(self.done)
        t.start()
        self.container.append(t)

    # ...

constructor:

  • 将其作为父级传递给"self“,但为此,线程必须允许接收,因此必须在
  • 中实现

代码语言:javascript
复制
class Thread(QThread):
    done = Signal()

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

    # ...
代码语言:javascript
复制
def clicked(self):
    t = Thread(self)
    t.done.connect(self.done)
    t.start()
票数 2
EN

Stack Overflow用户

发布于 2019-11-01 10:22:50

我找到了解决办法,但我不知道为什么要这么做。线程应该是类的一部分。

代码语言:javascript
复制
self.t = Thread()
self.t.done.connect(self.done)
self.t.start()
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58656311

复制
相关文章

相似问题

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