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 :

Avancement Progress Bar


Sujet :

C#

  1. #1
    Membre confirmé
    Inscrit en
    Mai 2009
    Messages
    172
    Détails du profil
    Informations forums :
    Inscription : Mai 2009
    Messages : 172
    Par défaut Avancement Progress Bar
    Bonjour à tous.

    J'ai créé une fonction assez longue à exécuter (qui modifie certains controls lors de son exécution ce qui rend l'utilisation de backgroundworker impossible).

    Et j'ai également créé via mon code (avant) une progressBar.

    Lorsque j'exécute ma fonction la première chose que je fait est rendre visible la progressbar.
    Ensuite durant l'exécution, j'ai mis Avancement.Value += 1; un peu partout.
    J'ai bien mis des try catch pas d'erreurs la fonction s'exécute bien correctement.

    Sauf que je ne vois pas la barre avancer en fait. (pourtant elle reste affichée 3 à 4 secondes, l'exécution de la fonction quoi).

    En fait je vois la progression seulement en cas d'erreur au bout de la 5ème incrémentation de la valeur (erreur dans le code qui précède) et bien la barre va se remplir jusqu'au 4 et m'afficher le message d'erreur.

    J'ai également tenté de rajouter un sleep de 100 ms après chaque incrémentation rien n'y change.
    De ce que j'ai pu lire sur internet ça viendrait du fait qu'on ne doit pas mettre la progressbar dans le meme thread, c'est ça? Comment je pourrais faire alors pour résoudre mon problème? sachant que dans ma fonction je raffraichit les controls de ma page donc pas de backgroundworker possibles ce qui expliquerait en partie le fait que le chargement soit extremement long.

    Voilà j'avoue que ça m'embete un peu, j'espère que vous aurez compris mon problème bien qu'il soit assez complexe à expliquer clairement.

    Merci, r0seBa

  2. #2
    Modérateur
    Avatar de sevyc64
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2007
    Messages
    10 254
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 254
    Par défaut
    COmmence par mettre des Application.DoEvents (ça existe en C# ? ) juste après tes Avancement.Value ....

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 7
    Par défaut
    Effectivement, si tu n'utilise pas un background worker, ta fonction longue à executer bloque complètement tout le processus de traitement des messages de rafraichissement, l'utilisation de Application.DoEvents (qui existe bien en C#) te permettra de palier à ce problème.

  4. #4
    Membre confirmé
    Inscrit en
    Mai 2009
    Messages
    172
    Détails du profil
    Informations forums :
    Inscription : Mai 2009
    Messages : 172
    Par défaut
    Bonjour,
    J'ai rajouté Application.DoEvents() après chaque incrémentation de la valeur de ma progressBar, cependant rien de change.
    Peut etre qu'il y a un rapport avec la définition de ma progressBar(j'en doute):
    Ou je définie juste la valeur max, la location du composant tout en remettant value à 0.

    Enfin dans tous les cas ça ne fonctionne toujours pas.

    Merci de votre aide.

  5. #5
    Membre très actif Avatar de oussi
    Profil pro
    Étudiant
    Inscrit en
    Octobre 2009
    Messages
    192
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : Maroc

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2009
    Messages : 192
    Par défaut
    Salut,

    Peut tu montrer ton code?
    Sa va vraiment aider pour t'aider

    Cordialement,

  6. #6
    Membre confirmé
    Inscrit en
    Mai 2009
    Messages
    172
    Détails du profil
    Informations forums :
    Inscription : Mai 2009
    Messages : 172
    Par défaut
    Le problème c'est que justement je peux pas trop il est bien trop long.
    Et si je vous met des extraits ça sera inutile je pense. M'enfin:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Avancement.Location = new Point(25, 25);
                Avancement.Minimum = 0;
                Avancement.Visible = true;
    ça commence comme ça.
    Ensuite j'ai une fonction qui récupère le nombre d'événements à gérer pour trouver la valeur max de ma progressbar.

    Puis mon code est divisé en de longues fonctions et après chaque j'ai un :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    Avancement.Value += 1;
    Application.DoEvents();
    Tout à la fin j'ai
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    if(Avancement.Maximum == Avancement.Value)
    {
    Avancement.Visible = false;
    }
    C'est dur d'expliciter plus mon code en fait.

    Sinon j'avais lu sur un forum qu'il fallait utiliser plusieurs threads, sauf que j'arrive pas à transformer les différents tuto sur internet pour que ça soit ma barre qui soit dans le nouveau thread est pas le super code bien long.

    Merci

  7. #7
    Modérateur
    Avatar de sevyc64
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2007
    Messages
    10 254
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 254
    Par défaut
    Exemple d'un code ou la progress bar est bien mise à jour :
    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
    22
                long k=0;
     
                Avancement.Value = 0;
     
                for (int i = 0; i < 100; i++)
                {
                    //Simule une longue boucle
                    for (int j = 0; j < 10000000; j++)
                    {
                        k++;
                    }
     
                    //Mise à jour de la progressbar
                    Avancement.Value += 1;
                    Application.DoEvents();
     
                    //SImule une 2nd longue boucle
                    for (int j = 0; j < 10000000; j++)
                    {
                        k++;
                    }
              }

    Le problème du multithreading est que tu aura besoin de mettre en place une communication InterThread pour venir mettre à jour ta progress bar, ce qui complique un peu les choses.

  8. #8
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 7
    Par défaut
    Citation Envoyé par r0seBa Voir le message
    Sinon j'avais lu sur un forum qu'il fallait utiliser plusieurs threads, sauf que j'arrive pas à transformer les différents tuto sur internet pour que ça soit ma barre qui soit dans le nouveau thread est pas le super code bien long.
    Merci
    C'est certain que d'utiliser plusieurs thread pour un traitement long est nettement préférable, par contre ce n'est pas à la barre de progression d'aller dans un autre thread, c'est a ton traitement!!

    Alors oui ton traitement effectue des opération sur des controls, mais cela n'est pas vraiment un problème car tu peux faire des appels thread safe.
    Voir : Comment : faire des appels thread-safe aux contrôles Windows Forms

  9. #9
    Membre confirmé
    Inscrit en
    Mai 2009
    Messages
    172
    Détails du profil
    Informations forums :
    Inscription : Mai 2009
    Messages : 172
    Par défaut
    Citation Envoyé par sevyc64 Voir le message
    Exemple d'un code ou la progress bar est bien mise à jour :
    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
    22
                long k=0;
     
                Avancement.Value = 0;
     
                for (int i = 0; i < 100; i++)
                {
                    //Simule une longue boucle
                    for (int j = 0; j < 10000000; j++)
                    {
                        k++;
                    }
     
                    //Mise à jour de la progressbar
                    Avancement.Value += 1;
                    Application.DoEvents();
     
                    //SImule une 2nd longue boucle
                    for (int j = 0; j < 10000000; j++)
                    {
                        k++;
                    }
              }

    Le problème du multithreading est que tu aura besoin de mettre en place une communication InterThread pour venir mettre à jour ta progress bar, ce qui complique un peu les choses.
    Pourtant c'est exactement comme ça que fonctionne mon code actuellement.
    Même en cas d'erreur la progressBar ne progresse pas en fait.

    Pour la créer :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Private Progressbar Avancement = new ProgressBar();
    déclaré en amont et je le réutilise dans ma fonction ensuite. Peut etre que c'est ça qui pose problème? Pourtant j'ai testé dans un nouveau projet avec ton code ça marche parfaitement.


    Si on pouvait réussir sans passer par le multi thread(je n'y connais absolument rien là dedans je ne sais pas du tout par où commencer quel tuto suivre etc) ça serait pas mal.

  10. #10
    Membre très actif Avatar de oussi
    Profil pro
    Étudiant
    Inscrit en
    Octobre 2009
    Messages
    192
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : Maroc

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2009
    Messages : 192
    Par défaut
    Sa peut vous paraitre bête mais essaye de mettre en commentaire ce bloc de code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    if(Avancement.Maximum == Avancement.Value)
    {
    Avancement.Visible = false;
    }
    Je viens de tester avec une petite fonction et il n'y a aucun problème c'est juste que la progression n'est pas visible à l'oeil et la barre devient invisible sans que vous ayez la chance de voir la progression.

    Pour moi c'était le problème j'espere vous avoir aider.

    Si ça ne marche pas essaye aussi de faire un débogage pas à pas pour voir si la Avancement.value s'incrémente correctement.

    Cordialement,

  11. #11
    Modérateur
    Avatar de sevyc64
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2007
    Messages
    10 254
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 254
    Par défaut
    Pour la créer : Private Progressbar Avancement = new ProgressBar(); déclaré en amont et je le réutilise dans ma fonction ensuite.
    Cela ne me pose aucun problème, à condition que le déclaration soit dans la même classe que l'utilisation mais en dehors de toute procédure ou fonction ou alors dans la même fonction

  12. #12
    Membre confirmé
    Inscrit en
    Mai 2009
    Messages
    172
    Détails du profil
    Informations forums :
    Inscription : Mai 2009
    Messages : 172
    Par défaut
    Citation Envoyé par oussi Voir le message
    Sa peut vous paraitre bête mais essaye de mettre en commentaire ce bloc de code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    if(Avancement.Maximum == Avancement.Value)
    {
    Avancement.Visible = false;
    }
    Je viens de tester avec une petite fonction et il n'y a aucun problème c'est juste que la progression n'est pas visible à l'oeil et la barre devient invisible sans que vous ayez la chance de voir la progression.

    Pour moi c'était le problème j'espere vous avoir aider.

    Si ça ne marche pas essaye aussi de faire un débogage pas à pas pour voir si la Avancement.value s'incrémente correctement.

    Cordialement,

    Bonjour,
    j'ai suivi tes conseils j'ai effectué la tache avec des breakspoints sur chaque incrémentation de la value.
    Cependant un moment value=5 (vérifié dans la fenetre local) et rien à l'écran toujours la barre égale à zéro.
    Sauf que ensuite la barre se remplit (j'ai enlevé le visible=false).

    Les précédentes incrémentations ont suivi des modifications des controls, peut être que ça a un rapport qu'il ne peut pas mettre tout à jour?

    Ce problème me laisse dans tous les cas perplexe.


    Merci

  13. #13
    Membre très actif Avatar de oussi
    Profil pro
    Étudiant
    Inscrit en
    Octobre 2009
    Messages
    192
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : Maroc

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2009
    Messages : 192
    Par défaut
    Salut,
    Cependant un moment value=5 (vérifié dans la fenetre local) et rien à l'écran toujours la barre égale à zéro.
    C'est normal que la progression reste toujours à zero pendant le debogage pas à pas. Il faut sortir du mode pas à pas (F5) pour que le changement soit visible à l'écran.

    Cordialement,

  14. #14
    Membre confirmé
    Inscrit en
    Mai 2009
    Messages
    172
    Détails du profil
    Informations forums :
    Inscription : Mai 2009
    Messages : 172
    Par défaut
    Bon visiblement le problème serait corrigé.
    J'ai considérablement augmenté la valeur maximum de ma barre d'avancement et je l'incrémente désormais à chaque "tour" de boucle et on voit bien la barre progresser.

    Merci de votre aide, r0seBa

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Progress Bar ou Slider Avancement vidéo
    Par cjacquel dans le forum MFC
    Réponses: 1
    Dernier message: 12/12/2006, 16h55
  2. [ATL] Petite question sur les progress bar
    Par MrMaze dans le forum MFC
    Réponses: 1
    Dernier message: 06/05/2005, 09h40
  3. [MFC]Changer la couleur d'un progress bar
    Par Deedier dans le forum MFC
    Réponses: 1
    Dernier message: 21/04/2005, 18h39
  4. [VB.NET] Mise en place d'une progress bar
    Par Hoegaarden dans le forum Windows Forms
    Réponses: 14
    Dernier message: 19/10/2004, 09h23
  5. Progress bar au boot
    Par saibe dans le forum Administration système
    Réponses: 2
    Dernier message: 18/08/2003, 10h01

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