Seite 1 von 1

QProcess - Erzwingen der Ausgaben einer Konsolenanwendung?

Verfasst: 11. Februar 2009 18:02
von QTler
Hallo,

ich habe verschiedene Konsolenanwendungen, die mit verschiedenen Parametern z.Z. über Batchdateien aufgerufen. Diese sollen nun mit einer C++-Anwendung über eine gemeinsame GUI aufgerufen werden, wofür ich QProcess verwende:

Code: Alles auswählen

QProcess *pProcess=new QProcess(this);
pProcess->start(programm, parameter);
Dabei ist es wichtig, dass die Textausgaben der einzelnen Programme auf der GUI der C++-Anwendung auch sichtbar sind, wofür ich das Signal readyReadStandardOutput() abfange. Mein Problem ist nun, dass die Ausgaben nur sichtbar sind, wenn ich die Konsolenanwendungen ohne Aufrufparameter starte, so dass ein Hilfetext angezeigt wird und sich diese Anwendung anschließend sofort wieder beendet.

Das Signal scheint also nur am Ende eines Prozesses gesendet zu werden. Da jeweils auch Eingaben erforderlich sind, kann ich leider nicht bis zum Ende des Prozesses warten, sondern muss zwischenzeitlich die Ausgabe "erzwingen". Ich habe bereits über den Umweg einer Textdatei nachgedacht. Weil diese Lösung aber auch verschiedene Nachteile mit sich bringt, würde mich interessieren, ob ihr noch weitere Lösungsansätze für das Problem habt. Die Konsolenanwendungen kann ich selbst nicht verändern (sind vorgegeben).

Die Suchfunktion hat mich leider auch nicht wirklich weiter gebracht.

Schon mal vielen Dank für eure Hilfe![/code]

Verfasst: 11. Februar 2009 18:48
von RD1978
Das Signal scheint also nur am Ende eines Prozesses gesendet zu werden.
Das kann nicht sein. Die Signale QProcess::readyReadStandardOutput() und QProcess::readyReadStandardError() werden gesendet, sobald neue Daten für den Prozess bzw. auf dem QIODevice verfügbar sind.

Verfasst: 12. Februar 2009 07:46
von solarix
IMHO hat es da noch Buffer dazwischen.... was ja Sinn macht, denn wer möchte schon nach jedem neuen Byte ein "readyReadStandardOutput()" .. und der Buffer wird entweder ab einer gewissen Grösse oder eben am Ende des Processes geflushd

evt. hilft ja "QIODevice::Unbuffered" beim OpenMode?
http://doc.trolltech.com/4.3/qprocess.html#start

Verfasst: 12. Februar 2009 07:48
von QTler
Das hätte ich auch gedacht. Leider wird der mit dem Signal QProcess::readyReadStandardOutput() verknüpfte Slot nur nicht permanent aufgerufen, wenn neue Daten zum Lesen vorhanden sind, sondern nur nach Ende eines Prozesses.

Kann es sein, dass die Konsolenanwendungen auf andere Devices schreiben, die QProcess nicht auslesen kann oder irgendein Puffer erst voll geschrieben werden muss? Lässt sich das mit dem Puffer irgendwie erzwingen?

Wenn ich die Tools über die Batchdatei oder direkt per Kommandozeile ausführe sind die Ausgaben wie erwartet sichtbar.

Verfasst: 12. Februar 2009 08:39
von QTler
solarix hat geschrieben:evt. hilft ja "QIODevice::Unbuffered" beim OpenMode?
http://doc.trolltech.com/4.3/qprocess.html#start
Leider nein.

Verfasst: 12. Februar 2009 08:50
von Christian81
Dann ruft Dein Konsolenprogramm nie flush() auf so dass der ganze Puffer erst beim Beenden des Programms geschrieben wird. In dem Fall kann Qt (und auch alles andere) nichts gegen machen.

Verfasst: 16. Februar 2009 09:19
von heizer_2
Genau!
Du musst in den Anwendungen ein fflush(stdout); hinter den Ausgaben einbauen. Dann wird der terminalpuffer übergeben und du bekommst das signal.

Verfasst: 20. Februar 2009 08:20
von waldo_pepper
Hallo,
die Ausgaben landen alle in einem stdout puffer der C-Lib, bei windows ca. 4k Byte gross. Dieser wird bei einer umleitung (und das macht qt) erst geleert, wenn er entweder voll ist, sich der prozess beendet hat oder dieser per fflush() vom process selber ausgegeben wurde.

Qt leitet die stdousgabe um, und windows hat damit irgendwelche allüren.
schau mal bitte hier nach
http://www.codeproject.com/KB/threads/RTconsole.aspx
Das ist windows und nicht qt. Ohne flush() geht hier nichts.

waldo