migrieren vom geerbten QThread zum Worker-Modell

So durch eine Menge Hilfe in meinen vorherigen Fragen Unterbrechung des QThread-Ruhezustands undPySide übergibt Signale von QThread an einen Steckplatz in einem anderen QThread) Ich habe mich entschlossen zu versuchen, von dem geerbten @ zu wechselQThread Modell zum Worker-Modell. Ich denke, ich sollte bei der @ bleibQThreadmodel wie ich das gemacht habe, und das andere modell geht nicht. Ich bin mir jedoch nicht sicher, warum das Worker-Modell bei mir nicht funktioniert.

Ich versuche dies zu tun. Bitte lassen Sie mich wissen, wenn etwas in meiner Methodik nicht stimmt.

Ich habe einQtGui.QWidget das ist meine Haupt-GUI. Ich benutze einQPushButton zu signalisieren Ich habe versucht, den Code auf das Wesentliche zu reduzieren, von dem ich glaube, dass es das Problem ist. Ich habe bestätigt, dassdatagramHandled Signal wird ausgegeben, aber daspacket_handled Slot scheint nicht angerufen zu werden.

class myObject(QtCore.QObject):
    def __init__(self):
        super(myObject, self).__init__()
        self.ready=False

    @QtCore.Slot()
    def do_work(self):
        #send a packet
        self.ready=False
        while not self.ready:
            time.sleep(0.01)

    @QtCore.Slot(int)
    def packet_handled(self, errorCode):
        print "Packet received."
        self.ready = True

class myWidget(QtGui.QWidget):
    datagramHandled = QtCore.Signal(int)
    startRunThread = QtCore.Signal()
    def __init__(self,parent=None, **kwargs):
        super(myWidget, self).__init__(parent=parent)
        # Bunch of GUI setup stuff (working)
        self.myRunThread = QtCore.QThread()
    @QtCore.Slot()
    def run_command(self):
        self.myRunObj = myObject()
        self.myRunObj.moveToThread(self.myRunThread)
        self.datagramHandled.connect(self.myRunObj.packet_handled)
        self.startRunThread.connect(self.myRunObj.do_work)
        self.myRunThread.start()
        self.startRunThread.emit()

    @QtCore.Slot()
    def handle_datagram(self):
        #handle the incoming datagram
        errorCode = 0
        self.datagramHandled.emit(errorCode)

Antworten auf die Frage(6)

Ihre Antwort auf die Frage