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

时间:2016-01-18 09:29:14

标签: python pyqt pyqt4 qthread

我有这部分代码,有时可以工作,有时会发出警告:
QThread: Destroyed while thread is still running

这部分是在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

我正在尝试使用此代码 - 我想压缩一些文件而不冻结主应用程序。所以我开始在后台工作的新线程。但是我需要一个功能,即如果出现问题,Widget会在压缩变为绿色后改变它的颜色。 也许我做错了什么?也许这不是方法?
我改变了颜色部分的大多数问题。

最诚挚的问候,
马立克

@three_pineapples,有时看起来并不开始。但是现在没有错误/警告 我修改了代码:

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

这是在类构造函数之前。 Temp类保持与上面相同,并且线程调用代码的一部分现在看起来像这样:

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

1 个答案:

答案 0 :(得分:2)

当线程被Python垃圾收集时会发生此问题。

您需要保存对QThread的引用,以便不对其进行垃圾回收。只需self.obj_thread = QtCore.QThread()

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