Pyqt4 + Threads

Python und das Qt-Toolkit, erstellen von GUIs mittels des Qt-Designers.
Antworten
mantus
User
Beiträge: 17
Registriert: Freitag 4. Dezember 2009, 09:08

hi

ich hab einen QDialog in dem ich folgenden slot implementiert habe

Code: Alles auswählen

    def performUpdate(self):
        self.re = -1
        timeout = 1000
        count = 1
        
        loader = FirmwareLoader(self.ui.getHWType(),
                                self.ui.getdevName(),
                                self.ui.getElfPath())
        loader.start()
        self.connect(loader, QtCore.SIGNAL("startupDone()"), self.done)
        self.connect(loader, QtCore.SIGNAL("startupError()"), self.error)
        
        
    def done(self):
        print "done"
        
    def error(self):
        print "error"
der loader ist extrem einfach und schaut wie folgt aus:

Code: Alles auswählen

class FirmwareLoader(QThread):
    '''
    classdocs
    '''
    def __init__(self,hwType,devName,filePath = None,tcsPath = None):
        '''
        Constructor
        '''
        
        QThread.__init__(self, None)
        self.hwType = hwType
        self.devName = devName
        self.filePath = filePath
        self.tcsPath = tcsPath
        self.re = -1
        self.session = 0
        self.stopme = 0
        self.ret = -1
        self.startupDone = QtCore.pyqtSignal()
        self.startupError = QtCore.pyqtSignal()
    
    def run(self):
        self.re, self.session = Startup (self.hwType,
                                      self.devName,
                                      self.filePath,
                                      self.tcsPath,
                                      True)
        if self.re == Success:
            self.startupDone.emit()
        else:
            self.startupError.emit()

    def __del__(self):
        self.wait()
aber ich hab 2 probleme :/

1. funktioniert der connect nicht wirklich
2. ist "loader.start()" aus irgend einem grund blockierden?
sollte nicht mit .start der thread im hintergrund gestartet werden und das GUI einfach weiterlaufen und sozusagen "warten" bis einer der slots ausgeführt wird?
lunar

Signale müssen Klassen-Attribute sein, zudem musst Du die Slots verbinden, bevor Du den Thread startest.

Warum der Thread blockiert, weiß ich nicht. Du zeigst nicht wirklich viel Quelltext.

Und verwende niemals __del__.
mantus
User
Beiträge: 17
Registriert: Freitag 4. Dezember 2009, 09:08

lunar hat geschrieben:Signale müssen Klassen-Attribute sein
self.startupError .... ist es das nicht?

das mit dem __del__ hab ich aus einem howto.

EDIT

Ah habs dank dir, jetzt funktionierts.
das mit dem .start ist mit ned klar .... das is übrigens das gesammte source, recht viel mehr mach ich nicht.

Ich würde gerne beim signal startupDone, noch die beiden variablen re und session mitgeben, wie stell ich das an?

Also ich hab jetzt eigentlich fast alles so wie ich es will, bis auf die tatsache das anscheinend .start() vom thread meinen GUI hauptthread blockiert :/ eine unterfunktion wäre nicht anders, wozu threads?
lunar

Nein, das ist ein Exemplar-Attribut.

Wie Du Signale mit Argumenten erstellst und verbindest, steht in der Dokumentation.

Und die Fehlermeldung sagt Dir, dass Du den Thread vor dem Beenden der Anwendung stoppen musst, nicht, dass Du __del__ überschreiben sollst. Wenn das in einem Howto steht, dann schmeiße das Howto weg :)
mantus
User
Beiträge: 17
Registriert: Freitag 4. Dezember 2009, 09:08

eigentlich steht das gesammte wissen in der dokumentation, so gesehen ist es ja komplett sinnlos hier fragen zu stellen, da sie eigentlich immer in der dokumentation beantwortet werden.

Nur irgendwie läuft das nicht so wie es in der doku steht ;)
in der doku steht nämlich auch das ich mit QThread.start() den thread starte, und das .start() eigentlich nicht blockierend ist so wie in meiner anwendung :/
Benutzeravatar
jbs
User
Beiträge: 953
Registriert: Mittwoch 24. Juni 2009, 13:13
Wohnort: Postdam

Warum gibts eigentlich __del__ noch in Python3?
[url=http://wiki.python-forum.de/PEP%208%20%28%C3%9Cbersetzung%29]PEP 8[/url] - Quak!
[url=http://tutorial.pocoo.org/index.html]Tutorial in Deutsch[/url]
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

jbs hat geschrieben:Warum gibts eigentlich __del__ noch in Python3?
Und wieso haben wir eigentlich ein PyQt-Subforum? ;-)
lunar

@mantus: In der Tat, es ist wirklich eher sinnlos, hier nach der Deklaration von Signalen mit mehreren Argumenten zu fragen, wenn in der Dokumentation sogar Beispiele dafür stehen ... wenn Du möchtest, kann ich Dir die Beispiele aber auch gerne aus der Dokumentation hierher kopieren.

Im Übrigen kannst Du auch connect in "new-style" verwenden, wenn Du bereits pyqtSignal verwendest.

"QThread.start()" ist nicht blockierend. In Deiner Anwendung ist nur ein Fehler enthalten, der zur Folge hat, dass .start() scheinbar blockierend ist. Wo der Fehler liegt, kann man Dir nicht sagen, solange Du kein minimales, lauffähiges Beispiel bereitstellst, mit dem man den Fehler nachvollziehen kann.
Antworten