python - 如何在 Pyqt 中的 QThreads 之间来回移动对象

标签 python pyqt qthread

在我的程序(使用 Python 2.7)中,我创建了一个包含一些重要数据和方法的对象。有些方法很耗 CPU,因此在某些情况下,我会在 CPU 密集型方法期间将对象移动到新的 QThread,然后让它们返回主线程。稍后,当调用 CPU 密集型方法时,我想再次将对象移动到另一个 QThread,但这失败了,提示“当前线程不是对象的线程”。

这是一个重现问题的简单示例:

import sys
from PyQt4 import QtCore, QtGui
from time import sleep

class ClassA(QtGui.QDialog):
    def __init__(self):
        super(ClassA, self).__init__()
        mainLayout=QtGui.QVBoxLayout()
        self.lineEdit=QtGui.QLineEdit()
        mainLayout.addWidget(self.lineEdit)
        self.setLayout(mainLayout)
        self.show()
        self.obj=ClassC(self)        
        self.executeProgram()
    def executeProgram(self):
        self.lineEdit.setText("Starting new thread...")
        self.thread=QtCore.QThread()
        self.obj.moveToThread(self.thread)        
        self.thread.started.connect(self.obj.doWork)
        self.obj.doingWork.connect(self.updateGui)
        self.obj.finished.connect(self.killThread)
        self.thread.start()
    def updateGui(self,message):
        self.lineEdit.setText(message)
    def killThread(self):
        self.thread.quit()
        self.thread.wait()
        self.obj.finished.disconnect()
        self.executeProgram()

class ClassC(QtCore.QObject):
    finished=QtCore.pyqtSignal()
    doingWork=QtCore.pyqtSignal(str)
    def __init__(self,parent=None):
            super(ClassC, self).__init__()
    def doWork(self):
        for i in range(5):
            self.doingWork.emit("doing work: iteration "+str(i))
            sleep(1)
        self.finished.emit()

if __name__=="__main__":
    app=QtGui.QApplication(sys.argv)
    obj=ClassA()
    app.exec_()       

是否可以多次将对象移动到不同的 QThread?如果是这样,我将如何修复我的代码来执行此操作?

最佳答案

注意 moveToThread 必须在对象当前所属的线程上调用,因此您可能需要先将对象移回主线程,然后再将其移至另一个线程。

在顶部某处添加 mainThread = QtCore.QThread.currentThread() 行,并在发出 finished 之前放置 self.moveToThread(mainThread) 信号。

关于python - 如何在 Pyqt 中的 QThreads 之间来回移动对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16499292/

相关文章:

python - QThreads Python - 通信

c++ - 理解 qthreads - 在线程之间共享数据

python - 在 Python 中为字符串列表创建字典和整数键

python - 为什么我的 PyQt 应用程序在 Mac OS X 的后台打开?

python - PyQt 自定义数据结构

python - python中部分函数的参数

c++ - Qt 多线程通信

python - 使用 neo4jrestclient 中的事务从索引中检索节点

python - 我可以从 wagtail 页面按钮触发 python 中的操作吗

python - 使用 getPageSource 检查网页上是否存在某些文本。我得到错误对象没有属性 getPageSource