python pyqt qthread

qthread daemon python



Cómo mover un objeto de ida y vuelta entre QThreads en Pyqt (1)

Nota moveToThread debe moveToThread en el subproceso al que el objeto pertenece actualmente, por lo que puede necesitar mover el objeto al subproceso principal antes de moverlo a otro subproceso.

Agregue la línea mainThread = QtCore.QThread.currentThread() algún lugar en la parte superior, y ponga self.moveToThread(mainThread) justo antes de emitir la señal finished .

En mi programa (usando Python 2.7), creo un objeto que contiene algunos datos y métodos importantes. Algunos de los métodos están hambrientos de CPU, por lo que en ciertos casos muevo el objeto a un nuevo QThread durante la duración de los métodos intensivos de CPU, y luego vuelvo al hilo principal. En un momento posterior, cuando se llama a un método intensivo de CPU, me gustaría mover el objeto a otro QThread nuevamente, sin embargo, esto falla diciendo "El hilo actual no es el hilo del objeto".

Aquí hay un ejemplo trivial que reproduce el problema:

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

¿Es posible mover un objeto a un QThread diferente varias veces? Si es así, ¿cómo arreglaría mi código para hacer esto?