私のプログラム (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 に複数回移動することは可能ですか? もしそうなら、これを行うためにコードを修正するにはどうすればよいですか?