3

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

4

1 に答える 1

4

NotemoveToThreadオブジェクトが現在属しているスレッドで呼び出す必要があるため、オブジェクトを別のスレッドに移動する前に、オブジェクトをメイン スレッドに戻す必要がある場合があります。

一番上のどこかに行を追加し、信号を発する直前にmainThread = QtCore.QThread.currentThread()置きます。self.moveToThread(mainThread)finished

于 2013-05-11T23:15:31.847 に答える