IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C# Discussion :

[Tutoriel] Afficher une progress bar dans une Console


Sujet :

C#

  1. #1
    Membre confirmé
    Avatar de nouanda
    Homme Profil pro
    Hobbyist
    Inscrit en
    Mai 2002
    Messages
    246
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Australie

    Informations professionnelles :
    Activité : Hobbyist

    Informations forums :
    Inscription : Mai 2002
    Messages : 246
    Points : 627
    Points
    627
    Par défaut [Tutoriel] Afficher une progress bar dans une Console
    Bonjour à tous,

    C'est parfaitement inutile, donc absolument indispensable, et je tenais à le partager avec vous...
    J'ai une application console dont je souhaitais connaitre l'avancement.
    Grosso modo, je parcours une liste, fais un peu de traitement, et affiche ligne par ligne le résultat. Normal.
    Mais comme je n'aime pas lire des choses du genre 164/1927, je me suis dit "mais dis donc! et pourquoi ne pas mettre une ProgressBar, gros ballot?"
    Et comme je suis également une bille en matière d’application console, j'ai du fouiller un peu.

    Donc voici mon résultat, certainement pas parfait, mais suffisant pour mon utilisation:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
            static string ProgressBar(int progress)
            {
                // Convertit le progress en texte, et on fixe la longueur à 3 caractères avec un petit PadLeft 
                string textual = progress.ToString().PadLeft(3, ' ');
                // Réutilisation de la même string pour afficher un texte représentant le progrès
                textual = "Progress " + textual + "% ";
                // Calcul de la taille disponible pour la progressbar
                // Console.WindowWidth retourne le nombre de colonnes de la console.
                // Il faut retrancher 1 car sinon le texte fait exactement la largeur de la console, 
                // ce qui entraînerait de facto un retour à la ligne (et ce serait moche, et l'effet 
                // progressbar disparaîtrait...)
                int barsize = Console.WindowWidth - 1 - textual.Length;
                // Initialisation d'un string builder d'une capacité égale à la taille de la progressbar
                StringBuilder p = new StringBuilder(barsize);            
                // Une petit règle de trois pour caler le progrès sur la taille de la progressbar
                progress = progress * barsize / 100;
     
                // Et la fonction retourne une string avec des padding sur la gauche pour afficher le progress
                // et un padding sur la droite pour donner une arrière plan à la progressbar
                return textual + p.ToString().PadLeft(progress, (char)219).PadRight(barsize, (char)176);
            }
    Notez que dans mon cas, les caractères que je souhaite utiliser nécessite d’accéder a la table Ascii étendue.
    Il faut donc rajouter, ce que j'ai fait en première ligne de mon application:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
            static void Main(string[] args)
            {
                Console.OutputEncoding = Encoding.GetEncoding(1252);


    Dans mon cas, je parcours une liste et souhaite toujours afficher le detail du traitement en cours, j'ai donc quelque chose du genre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
            foreach (var file in filelist)
            {
                    // blabla code blabla
                    // Notez le \r en debut de ligne, pour replacer le chariot au bon endroit
                    Console.WriteLine("\rblabla ceci s'est passe sur l'item file");
                    // Calcul du progres en %
                    int i = 100 * (filelist.IndexOf(file) + 1) / filelist.Count;
                    Console.Write(ProgressBar(i));
            }
    Ce qui me donne comme affichage une progress bar qui reste bien en bas de la fenêtre de la console:

    Nom : progressbar.png
Affichages : 1881
Taille : 42,3 Ko

    Si vous ne voulez pas afficher de détails, il est possible de faire par exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
                int MAX = 200;
                Console.WriteLine("Please wait...");
                for (int i = 1; i <= MAX; i++)
                {
                    Thread.Sleep(100);
                    int p = 100 * i / MAX;
                    Console.Write("\r"+ProgressBar(p));
                }
    Ce qui produira :

    Nom : progressbar2.png
Affichages : 1777
Taille : 23,8 Ko

    Il est également possible de positionner cela tout en haut ou tout en bas en jouant avec Console.SetCursorPosition():

    Nom : progressbar3.png
Affichages : 1641
Taille : 24,2 Ko

    Et si vous le voulez, j'ai aussi une progressbar du style Marquee (un bloc qui se déplace en avant/en arrière jusqu’à la fin de la tache):

    Nom : progressbar4.png
Affichages : 1645
Taille : 32,1 Ko

    Enfin bref, ça m'a amusé de faire cela, donc je le partage avec vous.

    @+
    " Entre le Savoir et le Pouvoir, il y a le Vouloir "

    Desole pour les accents, je suis en QWERTY...

  2. #2
    Expert confirmé
    Avatar de wallace1
    Homme Profil pro
    Administrateur systèmes
    Inscrit en
    Octobre 2008
    Messages
    1 966
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Administrateur systèmes
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 966
    Points : 4 005
    Points
    4 005
    Billets dans le blog
    7
    Par défaut
    Bonsoir,

    c'est une tres belle trouvaille, je ne m'etais jamais posé la question donc merci.

  3. #3
    Nouveau Candidat au Club
    Homme Profil pro
    illustrateur
    Inscrit en
    Novembre 2019
    Messages
    1
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : illustrateur

    Informations forums :
    Inscription : Novembre 2019
    Messages : 1
    Points : 1
    Points
    1
    Par défaut
    Bonjour,
    J'ai un soucis avec l'encodage des caractères visiblement. A la place de █ j'ai Û...

Discussions similaires

  1. Réponses: 6
    Dernier message: 13/11/2009, 16h06
  2. Réponses: 12
    Dernier message: 24/06/2009, 10h01
  3. ecrire variable dans une progress bar
    Par noakiss dans le forum VBA Access
    Réponses: 14
    Dernier message: 03/04/2008, 09h14
  4. [C#] Afficher une progress bar pendant une tâche de fond
    Par therock dans le forum Windows Forms
    Réponses: 2
    Dernier message: 01/06/2007, 08h33
  5. progress bar dans une status bar ?
    Par raggadoll dans le forum C++Builder
    Réponses: 1
    Dernier message: 02/11/2005, 15h17

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo