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

MFC Discussion :

affichage barre de progression


Sujet :

MFC

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2009
    Messages
    70
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 70
    Par défaut affichage barre de progression
    bonjour,

    mon programme compare les valeurs contenues dans deux tableaux.

    je voudrais afficher le niveau de correspondance à l'ai d'une progress bar. j'ai récupéré le code de codeguru pour avoir une barre personnalisée avec le pourcentage.

    malheureusement la barre ne s'affiche pas (ou trop vite et donc invisible). voici mon code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    void CEssaiDlg::OnComparaison() //je clique su le bouton comparaison
    {
      int count =0;
      for (int i=0; i<100; i++)
      {
        if (moy[i]==moy2[i]) //deux tableau définis dans ma fonction d'initialisation
        {
           count = count + 1;
        } //en plaçant ici m_progress.SetPos(count) j'aperçois la barre puis elle disparait très vite
      }
      m_progress.SetPos(count);
      m_progress.SetStep(1);
    }
    je n'arrive pas à laisser la barre de progression affichée

    merci d'avance

  2. #2
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Par défaut
    Il faut séparer l'affichage de ta barre de progression de ton calcul. Tant que tu reste dans ta boucle for tu ne redonnes pas la main à la boucle de message pour rafraîchir l'affichage. C'est pour ça que tu as l'impression que ta barre de progression ne fonctionne pas.
    Cette boucle :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
      for (int i=0; i<100; i++)
      {
        if (moy[i]==moy2[i]) //deux tableau définis dans ma fonction d'initialisation
        {
           count = count + 1;
        } //en plaçant ici m_progress.SetPos(count) j'aperçois la barre puis elle disparait très vite
      }
    se déroulera certainement plus vite qu'un mécanisme de suivi mis en place.

    Maintenant, si c'était juste pour l'exemple, et qu'en réalité ta boucle dure beaucoup plus longtemps, tu peux procéder de plusieurs façons :
    1/ 2 threads : un pour ta boucle et un pour l'affichage
    2/ timer qui vient faire un step de ta boucle toutes les n ms
    3/ le step de ta boucle dans OnIdle

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2009
    Messages
    70
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 70
    Par défaut
    merci

    mais je n'ai pas tout compris...

    j'ai déplacé la boucle dans la fonction qui remplit mes tableaux et j'ai toujours l'affichage de la barre associée au bouton. ça ne fonctionne pas.

    il se peut aussi que le compteur ne s'implémente pas car la condition de comparaison n'est pas bonne.......?

    quelle est la meilleure solution pour ce genre d'application?

    merci d'avance

  4. #4
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Par défaut
    Ton application est mono-thread. Donc pendant que tu exécutes la boucle :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
        m_progress.SetStep(1);
      for (int i=0; i<100; i++)
      {
        if (moy[i]==moy2[i]) //deux tableau définis dans ma fonction d'initialisation
        {
           count = count + 1;
        }
        m_progress.StepIt() // ici c'est bien incrémentée
      }
    L'affichage n'aura lieu que quand tu auras terminé le traitement sur ton bouton et rendu la main à l'application... Donc m_progress sera arrivé à la fin. D'où, ton impression visuelle que ça ne fonctionne pas.

    La première question est : vas-tu vraiment faire cette boucle de 100 itération ? Car, si elle est aussi courte, je te conseil de ne pas te compliquer la vie et d'oublier la barre de progression.

    En revanche, si ta boucle est vraiment longue, à ce moment tu as plusieurs possibilité :
    1/ Faire du multi-thread. Sur OnComparaison, tu créés un nouveau thread qui aura la charge de faire le traitement et à chaque boucle demandera à incrémenter la barre de progression. Si tu es débutant, oublies.
    2/ Sur OnComparaison, initier un contexte (indice_courant=0), démarrer un timer. Et sur chaque tick de ton timer, tu fais un step de ton traitement. Tu arrêtes ton timer dès que tu as terminé (en pseudo-code) :
    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
     
    Début OnComparaison
    Si traitement_en_cours
        Rien
    Sinon
        Initialiser traitement : indice_courant = 0
         Demarrer timer
    Fin OnComparaison
     
    Début On Timer
            if (moy[indice_courant]==moy2[indice_courant]) 
            {
               count = count + 1;
            }
            indice_courant++
            m_progress.StepIt()
            Si indice_courant>= max
                    Arreter timer
                    Dérouler résultat
            Fin Si
    Fin On Timer
    3/ Même principe que précédemment, sauf qu'au lieu de déclencher ton traitement dans On Timer, tu le fais s'exécuter sur OnIdle.

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2009
    Messages
    70
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 70
    Par défaut
    merci beaucoup.

    en effet je suis débutante.

    ma boucle doit sucruter 600 points. c'est beaucoup. je vais essayer ta méthode 2.

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2009
    Messages
    70
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 70
    Par défaut
    en essayant de coder selon ton pseudo code je ne comprends pas ce qu'est le traitement.

    Quand je clique sur comparaison j'ai la fonction OnComparaison qui est associée. C'est à ce niveau que j'ai
    "si traitement en cours : rien". Je ne comprends pas ce qu'est cette fonction.
    "sinon:init traitement et démarrer timer". Je place donc un SetTimer(x,y,z).

    est ce bon?

  7. #7
    Rédacteur
    Avatar de farscape
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    9 055
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2003
    Messages : 9 055
    Par défaut
    salut,
    une méthode simple: rajouter une pompe a messages dans la boucle
    voir faq:
    http://cpp.developpez.com/faq/vc/ind...rk#PumpMessage

  8. #8
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Par défaut
    Citation Envoyé par farscape Voir le message
    salut,
    une méthode simple: rajouter une pompe a messages dans la boucle
    voir faq:
    http://cpp.developpez.com/faq/vc/ind...rk#PumpMessage
    C'est effectivement une solution. Mais, j'avoue que ça me plait jamais trop d'insérer des pompes à messages. Question de goût probablement.

    Citation Envoyé par marie6631 Voir le message
    en essayant de coder selon ton pseudo code je ne comprends pas ce qu'est le traitement.

    Quand je clique sur comparaison j'ai la fonction OnComparaison qui est associée. C'est à ce niveau que j'ai
    "si traitement en cours : rien". Je ne comprends pas ce qu'est cette fonction.
    C'est pour que tu ne redémarres pas un nouveau traitement si ton traitement précédent est encore en cours.
    Citation Envoyé par marie6631 Voir le message
    "sinon:init traitement et démarrer timer". Je place donc un SetTimer(x,y,z).

    est ce bon?
    A priori, oui. Tu devrais aussi initialiser un contexte (indice de ta boucle, ID du timer pour pouvoir le stopper...).

  9. #9
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2009
    Messages
    70
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 70
    Par défaut
    la solution de la pompe à messages semble fonctionnait. mais j'ai un problème avec mes pointeurs

    merci à tous

  10. #10
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2009
    Messages
    70
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 70
    Par défaut
    excusez moi mais en fait la pompe à message ne fonctionne pas. j'ai une erreur d'application.

    de quoi cela peut il venir ?

    merci d'avance

  11. #11
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Par défaut
    Bonjour,
    Peux-tu préciser ton erreur et poster le code correspondant ?

  12. #12
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2009
    Messages
    70
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 70
    Par défaut
    Bien sur

    voila le code complet
    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
    23
    24
     
    void CEssaiDlg::OnFiltre()
    {
      moy=pFiltre(m_pdData);
      m_cvcDraw.AddDataBuffer(paramètre pour afficher le graph);
     
      moy2=pFiltre(m_pdData2);
      m_cvcDraw2.AddDataBuffer(paramètre pour afficher le graph);
    }
     
    void CEssai22Dlg::OnComparaison()
    {
      int count = 0;
      for(int i=0; i<582; i++)
      {
        if (moy[i]==moy2[i])
          {
          PumpMessage();
          count = count + 1;
          }
      }
      m_progress.StepIt();
      m_progress.SetPos(count);
    }
    pour MessagePump()
    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
     
    void MessagePump()
    {
      MSG msg;
      while(PeekMessage(&msg,NULL,0,0,PM_REMOVE))
      {
        if(AfxGetApp()->PreTranslateMessage(&msg))
        {
          ::TranslateMessage(&msg);
          ::DispatchMessage(&msg);
        }
        AfxGetApp()->OnIdle(0);
        AfxGetApp()->OnIdle(1);
      }
    }

  13. #13
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Par défaut
    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
    void CEssai22Dlg::OnComparaison()
    {
      int count = 0;
      m_progress.SetPos(0);
      m_progress.SetRange (0,582); // ?
      for(int i=0; i<582; i++)
      {
        
        if (moy[i]==moy2[i])
          {
          m_progress.StepIt();
          MessagePump(); // ?
          count = count + 1;
          }
      }
      
    }

  14. #14
    Rédacteur
    Avatar de farscape
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    9 055
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2003
    Messages : 9 055
    Par défaut
    il est clair que le positionnement de Messagepump n'est pas correcte ....
    et si ça plante ce n'est certainement pas la pompe a message la responsable.

  15. #15
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2009
    Messages
    70
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 70
    Par défaut
    avec ces modifications, la barre de progression s'affiche puis disparait très vite avec une erreur d'application qui suit me disant qu'une instruction ne peut pas être lue.

    je pense que ca vient d'un rafraichissement de mes variables....

    merci

Discussions similaires

  1. [XL-2013] Affichage des étapes d'une macro de longue durée + Barre de progression si possible
    Par Henri1830 dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 11/12/2014, 20h07
  2. Barre de progression : problème affichage
    Par link256 dans le forum Balisage (X)HTML et validation W3C
    Réponses: 4
    Dernier message: 21/07/2009, 12h23
  3. Réponses: 8
    Dernier message: 13/07/2007, 12h19
  4. [C#]Affichage d'une barre de progression
    Par boleduch dans le forum ASP.NET
    Réponses: 9
    Dernier message: 27/08/2005, 17h12
  5. [web] Barre de Progression ASCII
    Par Red Bull dans le forum Web
    Réponses: 13
    Dernier message: 05/06/2003, 12h56

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