QProcess - Erzwingen der Ausgaben einer Konsolenanwendung?

Alles rund um die Programmierung mit Qt
Antworten
QTler
Beiträge: 5
Registriert: 4. Februar 2009 19:01

QProcess - Erzwingen der Ausgaben einer Konsolenanwendung?

Beitrag 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]
RD1978
Beiträge: 84
Registriert: 5. Juni 2007 08:00
Wohnort: Stralsund (DDR)

Beitrag 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.
solarix
Beiträge: 1133
Registriert: 7. Juni 2007 19:25

Beitrag 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
QTler
Beiträge: 5
Registriert: 4. Februar 2009 19:01

Beitrag 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.
QTler
Beiträge: 5
Registriert: 4. Februar 2009 19:01

Beitrag von QTler »

solarix hat geschrieben:evt. hilft ja "QIODevice::Unbuffered" beim OpenMode?
http://doc.trolltech.com/4.3/qprocess.html#start
Leider nein.
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag 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.
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
heizer_2
Beiträge: 7
Registriert: 15. September 2008 19:51

Beitrag 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.
waldo_pepper
Beiträge: 1
Registriert: 6. Februar 2009 08:38
Wohnort: Hannover

Beitrag 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
Antworten