gpt4 book ai didi

python - QThread:在Python中线程仍在运行时被销毁

转载 作者:行者123 更新时间:2023-12-01 04:11:36 25 4
gpt4 key购买 nike

我有这部分代码,有时可以工作,有时会抛出警告:
QThread:线程仍在运行时被销毁

这部分位于 UiMainWindow 类中

obj_thread = QtCore.QThread()

def ok():
self.module_src_tree.setStyleSheet('background-color: #81F781')
obj_thread.quit()

def err():
self.module_src_tree.setStyleSheet('background-color: #F78181')
obj_thread.quit()

tmp = self.Temp(self, module_revision)
tmp.moveToThread(obj_thread)
tmp.finished.connect(ok)
tmp.error.connect(err)
obj_thread.started.connect(tmp.run)
obj_thread.start()

这是 UiMainWindow 类中的类

class Temp(QtCore.QObject):
finished = QtCore.pyqtSignal()
error = QtCore.pyqtSignal()

def __init__(self, gui, module_revision):
QtCore.QObject.__init__(self)
self.gui = gui
self.module_revision = module_revision

def run(self):
try:
self.gui.dp.pack_module_source(self.gui.module_src_show_list, self.gui.module_src_pack_list,
path=str(self.gui.path_box.text()), revision=self.module_revision)
self.finished.emit()
except Exception as e:
self.error.emit()
raise e

我想用这段代码做什么 - 我想压缩一些文件而不卡住主应用程序。所以我启动了在后台工作的新线程。但我需要这样的功能:如果出现问题,小部件在压缩完成后将其颜色更改为绿色或红色。
也许我做错了什么?也许这不是办法?
我遇到的大多数问题都是更改颜色部分。

最诚挚的问候,
马立克

<小时/>

@two_pineapples,似乎有时根本无法启动。但现在没有错误/警告。
我已将代码修改为:

class UiMainWindow(object):
# thread pool
thread_pool = [None, None, None, None]

这是在类构造函数之前。 Temp 类与上面相同,Thread 调用部分代码现在如下所示:

self.thread_pool[3] = None
self.thread_pool[3] = QtCore.QThread()

def ok():
self.module_src_tree.setStyleSheet('background-color: #81F781')
self.thread_pool[3].quit()

def err():
self.module_src_tree.setStyleSheet('background-color: #F78181')
self.thread_pool[3].quit()

tmp = self.Temp(self, module_revision)
tmp.moveToThread(self.thread_pool[3])
tmp.finished.connect(ok)
tmp.error.connect(err)
self.thread_pool[3].started.connect(tmp.run)
self.thread_pool[3].start()

最佳答案

当线程被 Python 垃圾回收时,会出现此问题。

您需要保存对QThread的引用,这样它就不会被垃圾回收。只需执行 self.obj_thread = QtCore.QThread()

如果有可能同时存在多个 QThread,并且您将引用存储在同一个变量中,那么您可能需要将对象存储在列表中。但是,当给定线程完成时,您需要从列表中清除对象(以便对它们进行垃圾收集),这样您就不会向应用程序引入内存泄漏。

关于python - QThread:在Python中线程仍在运行时被销毁,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34851261/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com