Anzeige:
Ergebnis 1 bis 9 von 9

Thema: hochzählende Statusanzeige

  1. #1
    Registrierter Benutzer Avatar von BLUESCREEN3D
    Registriert seit
    08.11.2002
    Beiträge
    665

    hochzählende Statusanzeige

    Wenn man in der Ausgabe eines Programmes eine hochzählende Statusanzeige, z. B. mit einem Prozentwert, haben will, dann muss bei jeder neuen Anzeige der vorherige Wert auf dem Bildschirm überschrieben werden.

    Durch die Ausgabe des Backspace-Zeichens \b funktioniert dies auch ganz gut.

    Einfachstes Beispiel in C:

    Code:
    #include <stdio.h>
    #include <stdlib.h>
    
    int main()
    	{
    	unsigned char i;
    
    	printf("Status:   0%%"); /* Anfangswert ausgeben */
    	fflush(stdout);
    
    	for(i=10;i<=100;i+=10)
    		{
    		sleep(1);
    		printf("\b\b\b\b"); /* Cursor vier Zeichen zurückbewegen */
    		printf("%3u%%",i); /* neuen Wert ausgeben */
    		fflush(stdout);
    		}
    
    	printf("\n");
    
    	return(EXIT_SUCCESS);
    	}
    Meine Fragen dazu:

    Gibt es auch Fälle in denen das in der Console falsch angezeigt wird, oder kann man sich sicher sein, dass das mit der Ausgabe des \b immer gut funktioniert?

    Wie sieht es mit der Umleitung der Ausgabe in eine Datei aus - kann man da verhindern, dass alle Prozentwerte inklusive der ganzen \b gespeichert werden?

    Gibt es einen anderen Weg für so eine Anzeige, ohne gleich (n)curses verwenden zu müssen?

  2. #2
    Registrierter Benutzer
    Registriert seit
    05.06.2003
    Beiträge
    118
    Hallo!

    Leider kann man sich nicht sicher sein, daß ein \b gut funktioniert. Dafür muß das Terminal IMHO Ansi-Sequenzen auswerten können. Ich habe schon oft vor furchtbaren Inhouse-Terminal-Lösungen für Unixe gesessen, bei denen weder Backspace noch Cursorbewegungen oder auch nur der Aufruf der letzten Kommandozeile funktionierten. Auf einem solchen Terminal würde dies meines Erachtens auch fehlschlagen.

    Dies liegt zum großen Teil daran, daß Ausgaben üblicherweise sogenannte Streams sind. Ein Strom von Zeichen, der zu einem beliebigen Ziel geleitet wird. Problematisch dabei ist folgendes: Man stelle sich vor, der Stream wird sozusagen "Realtime" an einen Drucker geleitet. Der Drucker druckt also fleißig die Zeichen mit und stößt auf ein \b. Soll er jetzt zurückscrollen? Ein Strom kann nicht rückwärts laufen.

    nCurses ist für genau solche Probleme geschaffen und melden dir IMHO auch zurück, falls das genutzte Terminal nicht ANSI-fähig ist, so daß du dich darum auch nicht kümmern müßtest.

    TME

  3. #3
    Registrierter Benutzer
    Registriert seit
    02.07.2004
    Beiträge
    456
    Vor allem ist ncurses nicht sehr schwer zu erlernen. Ich pack mal zwei meiner Sourcen in den Anhang, mit denen es ein bisschen einfacher ist, Fenster-Oberflächen - und damit evtl. auch solche Ausgaben - darzustellen.

  4. #4
    Registrierter Benutzer Avatar von BLUESCREEN3D
    Registriert seit
    08.11.2002
    Beiträge
    665
    Danke, aber in kleinen Tools curses zu benutzen finde ich etwas übertrieben.

  5. #5
    Registrierter Benutzer
    Registriert seit
    02.07.2004
    Beiträge
    456
    Warum? Wird doch eh dynamisch zugelinkt. Und da es bestandteil des Systems ist, ist es doch kein Problem. Übertrieben ist es nicht, finde ich.

  6. #6
    Registrierter Benutzer
    Registriert seit
    25.10.2004
    Beiträge
    819
    \b ist keine ANSI-Sequenz, das sollte eigentlich überall gehen. (Dort, wo es nicht geht, wird curses auch nicht helfen können)

    Statusanzeigen würde ich eigentlich immer an stderr senden, das hat den Vorteil, dass
    1. Die Ausgabe ungepuffert ist
    2. Sie dir nicht die Dateien zumüllt, wenn du nur stdout umlenkst.

  7. #7
    Registrierter Benutzer
    Registriert seit
    05.06.2003
    Beiträge
    118
    Zitat Zitat von Joghurt
    \b ist keine ANSI-Sequenz, das sollte eigentlich überall gehen. (Dort, wo es nicht geht, wird curses auch nicht helfen können)
    Asche auf mein Haupt. Hast du ggf. mal eine Referenz, was unter "normale" Steuerzeichen und was unter ANSI-Sequenzen fällt?

    TME

  8. #8
    Registrierter Benutzer
    Registriert seit
    25.10.2004
    Beiträge
    819
    Alles, was mit ESC (0x1b) beginnt, sind Steuersequenzen, die ANSI-Sequenzen haben glaube ich alle die Form ESC [ kommando

    man console_codes

  9. #9
    Registrierter Benutzer Avatar von BLUESCREEN3D
    Registriert seit
    08.11.2002
    Beiträge
    665
    Zitat Zitat von 7.e.Q
    Wird doch eh dynamisch zugelinkt.
    Und wenn doch mal keine curses-lib da ist (minimalistisches Rettungssystem z.B.) funzt es gleich nicht mehr...

    Zitat Zitat von Joghurt
    \b ist keine ANSI-Sequenz, das sollte eigentlich überall gehen. (Dort, wo es nicht geht, wird curses auch nicht helfen können)
    Jo, mir fällt gerade auf, dass ein einzelnes Byte nie eine Sequenz sein könnte - thx

    Zitat Zitat von Joghurt
    Statusanzeigen würde ich eigentlich immer an stderr senden, das hat den Vorteil, dass
    1. Die Ausgabe ungepuffert ist
    2. Sie dir nicht die Dateien zumüllt, wenn du nur stdout umlenkst.
    Ich würde stderr eigentlich nur für Fehlermeldungen benutzen - heißt ja nicht umsponst stdERR
    Oder gibt es irgendwo Empfehlungen, was man am besten wo ausgeben sollte?

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •