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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  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?

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