PySide2 Qthread崩溃

时间:2019-11-01 08:43:16

标签: python qthread pyside2

由于Qtcore.Signal,我想使用PySide2 Qtcore.Qthread,但最终出现此错误: 流程结束,退出代码为-1073740791

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

更新

那么,为什么这段代码还会引发相同的错误?

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

2 个答案:

答案 0 :(得分:2)

说明

如果在CMD /终端中运行代码,则会出现以下错误:

QThread: Destroyed while thread is still running
Aborted (core dumped)

错误是由于线程是局部变量而导致线程仍在运行时被销毁,另一方面,QThread需要事件循环才能运行

解决方案

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”是一个局部变量,在执行单击后将被消除,从而导致与初始代码相同的问题,解决方案是防止该变量立即被破坏,为此有2个选项:

  • 设置“ t”类属性
def clicked(self):
    self.t = Thread()
    self.t.done.connect(self.done)
    self.t.start()
  • 将QThread存储在寿命更长的容器中:
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)

    # ...
  • 将其作为父级传递给“ self”,但是为此,必须允许Thread接收,因此您必须在构造函数中实现它:
class Thread(QThread):
    done = Signal()

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

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

答案 1 :(得分:0)

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

self.t = Thread()
self.t.done.connect(self.done)
self.t.start()