PySide übergibt Signale von QThread an einen Steckplatz in einem anderen QThread

Ich habe mein Problem gelöst, indem ich das @ verschoben habmySubQThread run() in dasmyQThread run()

Das heißt, ich möchte immer noch wissen, warum das, was ich zuvor versucht habe, nicht funktioniert hat.

Ich bin ziemlich neu im Threading. Ich stoße auf dieses Problem und denke, ich nähere mich möglicherweise den Dingen, die falsch sind. Ich bin offen für einen anderen Ansatz, von dem ich weiß, dass er etwas kompliziert ist.

Ich habe eine GUI, die eine neue abgeleitete @ macQThread nennen wir esmyQThread In diesem Thread wird gerade ein Prozess ausgeführt, der einen anderen Thread erstellt. call itmySubQThread das Problem, das ich habe, ist wie folgt, ich habe Signale in meiner GUI zum Beispiel definiert:signalA = QtCore.Signal(int) und ein Slot inmyQThread Der Steckplatz immySubQThread scheint nie das Signal zu bekommen.

Hier ist ein funktionierendes Beispiel. (etwas modifiziert)

from PySide import QtCore, QtGui
import time



class myQThread(QtCore.QThread):
    myThreadSignal = QtCore.Signal(int)
    def __init__(self, parent):
        super(myQThread, self).__init__(parent=parent)

    def run(self):
        self.subThread = mySubQThread(parent=self)
        self.myThreadSignal.connect(self.subThread.sub_thread_slot)
        self.myThreadSignal.connect(self.test_slot)
        print "starting subthread..."
        self.subThread.start()

        while self.subThread.isRunning():
            print "myQThread is alive!"
            time.sleep(1)
        print "myQThread exiting run..."
    @QtCore.Slot(int)
    def my_thread_slot(self, a):
        print "1b) Made it here!"
        self.myThreadSignal.emit(a)

    @QtCore.Slot(int)
    def test_slot(self, a):
        print "2a) Made it here!"

class mySubQThread(QtCore.QThread):
    mySubSignalA = QtCore.Signal(int)
    def __init__(self, parent):
        super(mySubQThread, self).__init__(parent=parent)
        self._abort = False
    def run(self):
        #Do some processing
        #Wait for signal
        self._abort = False
        while not self._abort:
            print "mySubQThread is alive!"
            time.sleep(1)
        print "mySubQThread exiting run..."

    @QtCore.Slot(int)
    def sub_thread_slot(self, a):
        print "2b)Never make it here!"
        self._abort = True


class myWidget(QtGui.QWidget):
    myWidgetSignal = QtCore.Signal(int)
    def __init__(self, parent=None):
        super(myWidget, self).__init__(parent=parent)
        #simple Widget to test this out....
        myLayout = QtGui.QVBoxLayout()
        self.runButton = QtGui.QPushButton("run")
        self.runButton.clicked.connect(self.run_button_pressed)

        self.otherButton = QtGui.QPushButton("other")
        self.otherButton.clicked.connect(self.other_button_pressed)

        myLayout.addWidget(self.runButton)
        myLayout.addWidget(self.otherButton)

        self.setLayout(myLayout)
    @QtCore.Slot()
    def run_button_pressed(self):
        self.processThread = myQThread(self)
        self.myWidgetSignal.connect(self.processThread.my_thread_slot)
        self.myWidgetSignal.connect(self.test_slot)
        self.processThread.start()
    @QtCore.Slot()
    def other_button_pressed(self):
        self.myWidgetSignal.emit(1)

    @QtCore.Slot(int)
    def test_slot(self, a):
        print "1a) Made it here!"

if __name__ == "__main__":
    import sys
    myApp = QtGui.QApplication(sys.argv)
    myWin = myWidget()
    myWin.show()
    sys.exit(myApp.exec_())

Hier ist eine Beispielausgabe:

Beachten Sie Folgendes, wenn Sie die Zeile ändern:

        self.subThread = mySubQThread(parent=self)

z

        self.subThread = mySubQThread(parent=None)

it beklagt sich nicht mehr wie in der Beispielausgabe. beides zeigt nicht, dass es zu 2B @ kom

QObject: Cannot create children for a parent that is in a different thread.
(Parent is myQThread(0x3c3faf0), parent's thread is QThread(0x2792548), current thread is myQThread(0x3c3faf0)
starting subthread...
myQThread is alive!mySubQThread is alive!

mySubQThread is alive!
myQThread is alive!
1b) Made it here!
2a) Made it here!
1a) Made it here!

Antworten auf die Frage(2)

Ihre Antwort auf die Frage