sigro hat geschrieben:leider hängt wieder der QtGui.QProgressDialog Balken.
Das wundert dich?
Du rufst den Prozess ja wieder blockierend auf, in dem du .wait() verwendest. Dadurch ist die Ereignisschleife wiederum blockiert, und nichts funktioniert.
Um Threading wirst du nicht herum kommen, wenn du die Module der Standardbibliothek verwenden willst.
Am besten wäre es allerdings, auch für die Prozesskontrolle auf die Qt Bibliotheken zurückzugreifen. Verwende doch am besten die Klasse QtCore.QProcess. Sie unterstützt nämlich das Signal-Slot-Konzept und integriert die Prozesskontrolle somit in die Qt-Ereignisschleife. Der Ablauf sieht dabei in etwa so aus (angenommen, der Prozess wird mit einen Button-Klick gestartet):
Im Slot des clicked-Signals des Buttons erzeugst du das QProcess Objekt, verbindest das "finished"-Signal mit einem Slot, startest den Prozess und zeigst den QProcessDialog an.
Im Slot des "finished"-Signals kannst du dann den QProcessDialog wieder schließen, und die Ausgabe des Prozesses über die Methode QProcess.readAllStandardOutput() auslesen und weiterverarbeiten.
Schon hat sich das Problem erledigt
Nur ein genereller Tipp: Die Ereignisschleife von Qt läuft immer nur ab, wenn der Hauptthread keine blockierenden Aufrufe enthält. Deswegen müsst du dich vom normalen sequentiellen Programmablauf verabschieden, und dich auf das Signal-Slot-Konzept einlassen, dass ereignisbasierte Programmierung ermöglicht und so die Ereignisschleife berücksichtigt. Genau aus diesem Grund solltest du bei der Qt4 Programmierung auch dann auf Qt-Klassen zurückgreifen, wenn die benötigte Funktionalität eigentlich in schon in der Standardbibliothek oder in anderen Modulen verfügbar ist.
Ich kann nur für Qt sprechen, aber das ist bei anderen Toolkits möglicherweise ähnlich.