我想使用PySide2 Qtcore.Qthread是因为Qtcore.Signal,但是我最终得到了这样的错误:用退出代码-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_())发布于 2019-11-01 09:00:59
解释
如果在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“是一个局部变量,在执行单击后将被删除,导致与初始代码相同的问题,解决方案是防止它立即被销毁,为此有两个选项:
def clicked(self):
self.t = Thread()
self.t.done.connect(self.done)
self.t.start()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:
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()发布于 2019-11-01 10:22:50
我找到了解决办法,但我不知道为什么要这么做。线程应该是类的一部分。
self.t = Thread()
self.t.done.connect(self.done)
self.t.start()https://stackoverflow.com/questions/58656311
复制相似问题