Forum: PC-Programmierung C++ konsole Prozessfortschritt anzeigen?


von Phillipp D. (Gast)


Lesenswert?

Hi!

Ich hätte gerne in meinen Programmen bei Berechnungen oder Ausführen von 
zeitintensiven Befehlen im Hintergrund eine Anzeige des Fortschritts in 
Prozent. Die Programme werden nur in der Konsole ausgeführt.

Ich finde dazu aber kein Beispiel wie man sowas macht.
Also in der Konsole soll es dann aussehen wie:

Berechne .... 42%

oder besser noch diesen netten Balken:

Berechne :  [=========                ] 42%

Hat da jemand irgenwo ein Beispiel oder irgendeinen Link? Oder wie nennt 
man denn sowas, ich finde nichts.


Vielen Dank für Tips!

von Sven P. (Gast)


Lesenswert?

Nennt sich in der Regel 'Steuercodes' für das Terminal.
Such mal nach Anleitungen zum VT100 oder sowas, da ist beschrieben, wie 
man den Cursor bewegt, Zeichen löscht, Farben einstellt und so weiter.

Klappt dann z.B. mit jedem VT100-Terminal.

Weitere Stichworte:
- termios
- termcap
- ncurses

von El Cattivo (Gast)


Lesenswert?

Welches Betriebssystem denn?

von Tom (Gast)


Lesenswert?

Die simpelste Moeglichkeit (nur unter Linux getestet):
1
#include <iostream>
2
#include<cstdlib>
3
#include<unistd.h>
4
5
void print_progress(const float& percentage)
6
{
7
        printf("\rProgress: %6.2f%%", percentage);
8
        fflush(stdout);
9
}
10
11
int main()
12
{
13
        printf("starting....\n");
14
        for (float f(0.0); f < 100.0; f += 1.27)
15
        {
16
                print_progress(f);
17
                usleep(100000);
18
        }
19
        printf("\n...done\n");
20
}

von Klaus W. (mfgkw)


Lesenswert?

Die Richtung, die Sven vorgibt, ist richtig.
Zudem wird man noch die Pufferung abstellen müssen.

Ich habe mal spaßeshalber das ganze in einer dreist-primitiven
Variante probiert: Zeile ausgeben, nach einer Weil mit Backspace
wieder löschen, und neu ausgeben:
1
#include <stdlib.h>
2
//#include <stddef.h>
3
#include <stdio.h>
4
//#include <stdint.h>
5
#include <unistd.h> // bei Linux
6
7
8
int main( int nargs, char **args )
9
{
10
  int iProzent;
11
12
  for( iProzent=0; iProzent<=100; ++iProzent )
13
  {
14
    // Zeile ausgeben:
15
    int nZeichen = printf( "Berechne: [" );
16
    int i, iBlock;
17
    // Damit es in eine Zeile passt, nur halb soviele Blcke ausgeben
18
    // wie maximal Prozent vorkommen:
19
    for( iBlock=0; iBlock<iProzent/2; ++iBlock )
20
    {
21
      putchar( '=' );
22
      nZeichen++;
23
    }
24
    // den Rest auf 100 mit Leerzeichen füllen:
25
    for( ; iBlock<100/2; ++iBlock )
26
    {
27
      putchar( ' ' );
28
      nZeichen++;
29
    }
30
    // restliche Zeile:
31
    nZeichen += printf( "] %3d%%", iProzent );
32
    fflush( stdout );
33
34
    sleep( 1 );
35
    // vor der nächsten Zeile entsprechend viele Backspace ausgeben:
36
    for( i=0; i<nZeichen; ++i )
37
    {
38
      putchar( '\b' );
39
    }
40
  }
41
42
  printf( "Ich habe fertig!\n" );
43
44
45
  return 0;
46
}

Das sieht in einem xterm-Fenster absolut sauber aus und flackert nicht.
Vielleicht geht das dann sogar ohne Änderung unter Windows.

von Klaus W. (mfgkw)


Lesenswert?

Tom schrieb:
> \r

stimmt, auch eine Möglichkeit (und einfacher als meine Version)!

von Frickler (Gast)


Lesenswert?

boost::progress_display aus dem timer Paket

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.