[quote=rudolf,21.05.2007, 11:06][...]
} else {
STDOUT->autoflush(1);
exec ( "aria2c", @options );
CORE::exit();
}
[/quote]
Dieser Teil des Codes ergibt wenig Sinn. Autoflush auf
STDOUT zu aktivieren hat für den Aufruf von
CORE::exit keinerlei Effekt. Und falls der Aufruf von
exec erfolgreich ist, hat es natürlich erst recht keinen Effekt, denn in dem Falle sind der gesamte Perlinterpreter und das laufende Skript aus dem Speicher des aktuellen Prozesses verschwunden und wurden durch das auszuführende Programm ersetzt.
[quote=rudolf,21.05.2007, 11:06][...]
Mir gefällt nicht so gut, dass ich mit repeat und update das GUI aktiv halten muss, außerdem taucht der Cancel-Button zwar auf aber er reagiert nicht. Ich habe gelesen dass dies auch mit Tk::fileevent geht.
[/quote]
Von Tk habe ich leider keine Ahnung, aber ich denke mal, dass diese Fileevent-Funktionalität ein Wrapper um den Systemaufruf select oder poll sein muss. Da kannst Du dann bestimmt sowohl darauf reagieren, dass dein Kindprozess neue Daten geschrieben hat, als auch darauf, dass er neue Daten lesen will oder darauf dass er seine Ausgabe geschlossen hat, weil er sich beendet hat.
[quote=rudolf,21.05.2007, 11:06][...]
Ein weiteres Problem ist der Output von aria2c. Der Fortschritt wird zwar mit %Zahlen angezeigt, aber immer in der gleichen Zeile (ohne Newline).
Dadurch liest mein Parentprozess nur die letzte Angabe mit 99 oder 100%, trotz autoflush.
[/quote]
Wie oben bereits erwähnt, hat das Aktivieren von Autoflush keinen Effekt, da Du ein externes Programm ausführst, keinen Perlcode.
Stattdessen solltest Du vielleicht entweder eine Kommandozeilenoption von aria2c suchen, die die Ausgabe modifiziert, oder vor dem Einlesen der Ausgabe das Eingabedatensatztrennzeichen modifizieren (
local $/ = "\r" könnte hier helfen).
[quote=rudolf,21.05.2007, 11:06][...]
Auch mit der STDERR-Ausgabe komme ich noch nicht klar. Momentan fällt die ganz unter den Tisch. Gibt es einen anderen Weg als diese Ausgabe in eine Datei zu schreiben und anschließend zu lesen?[...]
[/quote]
Um nicht nur
STDOUT oder
STDIN bei einem Kindprozess umzuleiten gibt es die Standardmodule
IPC::Open2 und
IPC::Open3.
(edit: Tippfehler korrigiert)\n\n
<!--EDIT|murphy|1179747789-->
When C++ is your hammer, every problem looks like your thumb.