Thread Fortschrittsanzeige und Prozessabbruch: GUI mit pipe und fork (4 answers)
Opened by rudolf at 2007-05-21 13:06

rudolf
 2007-05-21 13:06
#46339 #46339
User since
2007-05-21
3 Artikel
BenutzerIn
[default_avatar]
Hallo zusammen,

ich versuche mich gerade mit einer GUI für das Kommandozeilenprogramm aria2c.

Folgende Funktion möchte ich einbauen:
nach Start von aria2c soll das GUI aktiv bleiben und eine Fortschrittsanzeige sowie einen Cancel-Button beinhalten.

Ich gehe so vor (unter Linux):
(nur schematisch, bitte keine Syntaxfehler suchen)

Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
use IO::Handle; 

if ($pid = open(CHILD, "-|")) {

   {erzeuge ein toplevel mit ProgressBar und Cancel-Button}

   repeat (500, {toplevel->update} );

   while <CHILD> {  
   {lese die Ausgabe von aria2c und zeige den Fortschritt an}
  }
   
   close(CHILD);

} else {    
   STDOUT->autoflush(1);
   exec  ( "aria2c", @options );    
   CORE::exit();
}



Beim Drücken des Cancel-Buttons soll "Kill 9" an den Kindprozess gesandt werden.

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. Wie kriege ich dann einen sauberen Abschluss des Kindprozesses hin. Möglicherweise mit waitVariable? Wäre dies der bessere Weg?

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.
Damit ist natürlich eine Fortschrittsanzeige nicht möglich. Wie kriege ich es hin, dass auch die Zwischenergebnisse verarbeitet werden?

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? Eigentlich wollte ich die Shell ja ganz aus dem Spiel lassen.

Vielen Dank
Rudolf

View full thread Fortschrittsanzeige und Prozessabbruch: GUI mit pipe und fork