代码之家  ›  专栏  ›  技术社区  ›  Marek

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

  •  1
  • Marek  · 技术社区  · 8 年前

    我得到了这部分代码,它有时有效,有时发出警告:
    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会改变颜色。
    也许我做错了什么?也许不是这样的?
    我遇到的大多数问题是改变颜色部分。

    顺致敬意,
    马雷克


    @三个苹果,看起来好像有时候根本不会开始。但目前没有错误/警告。
    我已将代码修改为:

    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 回复  |  直到 8 年前
        1
  •  2
  •   three_pineapples    8 年前

    当Python对线程进行垃圾收集时,会出现此问题。

    您需要保存对 QThread 所以它不是垃圾收集的。就这么做 self.obj_thread = QtCore.QThread()

    如果有可能 Q螺纹 s将同时存在,并且您将引用存储在同一个变量中,那么您可能需要将对象存储在列表中。然而,当给定的线程完成时,您需要从列表中清除对象(这样它们就会被垃圾收集),这样您就不会给应用程序带来内存泄漏。