Wie bekomme ich QThreads, um in einem Konsolen-PySide-Programm zu arbeiten?

Ich versuche zu lernen, wie man Threading in einem Python-Programm verwendet. Ich benutze PySide und QThreads, da ich Gui danach mit PySide implementieren werde.

Ich habe die Hauptaufnahme des Threads verstanden, zumindest denke ich. Aber ich bin immer noch mit Event-Loops verwechselt. Und ich denke, das ist das Problem mit meiner Anwendung.

Hier ist eine Beispielanwendung, die ich nicht richtig arbeiten kann. In meiner Hauptklasse habe ich mehrere Arbeiter-Threads und ich möchte ihnen, um ihre Fortschritte an die Haupthauptklasse zu melden. Aber das Hauptprogramm druckt keine Fortschrittsmeldungen in Echtzeit.

Wie könnte ich das zur Arbeit bringen?

from PySide import QtCore import time, sys class MyWorkerThread(QtCore.QThread): message = QtCore.Signal(str) def __init__(self, id, parent=None): super(MyWorkerThread, self).__init__(parent) self.id = id def run(self): for i in range(10): self.message.emit("%d: %d" % (self.id, i)) time.sleep(0.2) class MainProgram(): def __init__(self, parent=None): self.threads = [] self.addWorker(MyWorkerThread(1)) self.addWorker(MyWorkerThread(2)) def addWorker(self, worker): worker.message.connect(self.printMessage, QtCore.Qt.QueuedConnection) self.threads.append(worker) def startWorkers(self): for worker in self.threads: worker.start() worker.wait() self.workersFinished() def workersFinished(self): QtCore.QCoreApplication.instance().quit() @QtCore.Slot(str) def printMessage(self, text): sys.stdout.write(text+'\n') sys.stdout.flush() if __name__ == '__main__': app = QtCore.QCoreApplication(sys.argv) m = MainProgram() m.startWorkers() sys.exit(app.exec_()) 

One Solution collect form web for “Wie bekomme ich QThreads, um in einem Konsolen-PySide-Programm zu arbeiten?”

worker.wait() ist das Problem. Dieser Aufruf blockiert den Hauptfaden (in diesem Fall die eine laufende Ereignisschleife), bis der Arbeiter seinen Job beendet hat.

Hier ist eine etwas geänderte Version (ich habe meine Änderungen kommentiert):

 from PySide import QtCore import time, sys class MyWorkerThread(QtCore.QThread): message = QtCore.Signal(str) def __init__(self, id, parent=None): super(MyWorkerThread, self).__init__(parent) self.id = id def run(self): for i in range(10): self.message.emit("%d: %d" % (self.id, i)) time.sleep(0.2) class MainProgram(): def __init__(self, parent=None): self.threads = [] self.addWorker(MyWorkerThread(1)) self.addWorker(MyWorkerThread(2)) def addWorker(self, worker): worker.message.connect(self.printMessage, QtCore.Qt.QueuedConnection) # connect the finished signal to method so that we are notified worker.finished.connect(self.workersFinished) self.threads.append(worker) def startWorkers(self): for worker in self.threads: worker.start() # no wait, no finished. you start the threads and leave. def workersFinished(self): if all(worker.isFinished() for worker in self.threads): # wait until all the threads finished QtCore.QCoreApplication.instance().quit() @QtCore.Slot(str) def printMessage(self, text): sys.stdout.write(text+'\n') sys.stdout.flush() if __name__ == '__main__': app = QtCore.QCoreApplication(sys.argv) m = MainProgram() m.startWorkers() sys.exit(app.exec_()) 
  • Qt4: Schreiben Sie eine Funktion, die einen Dialog erzeugt und die Wahl des Benutzers zurückgibt
  • Wie man QTableView letzte Spaltenüberschrift ausdehnt
  • Zeichnung in einem matplotlib-Widget in QtDesigner
  • Ändern Sie die Größe eines QGraphicsItem mit der Maus
  • QDialog nicht aus dem Hauptfenster öffnen (pyQt)
  • Bitte weisen Sie auf (gute) Dokumentation über QT-Layouts für die Plasma-Entwicklung hin
  • Beste Weg, um Python-Scripting in QT-Anwendung hinzufügen?
  • QTableView Sortierung fehlschlägt nach setHorizontalHeader ()
  • PyQt-Ereignis zweimal ausgegeben
  • Was ist der beste Ansatz bei der Erstellung der Anwendung von PySide
  • Login-Dialog PyQt
  • Python ist die beste Programmiersprache der Welt.