Partage
  • Partager sur Facebook
  • Partager sur Twitter

QProgressBar

Ne se met pas à jour

    11 mai 2008 à 19:28:20

    Bonjour, j'ai pas mal cherché sur ce problème (mal peut être) .
    Je fais un programme dont le but est d'encoder une chaine dans une structure de donnée ayant certaines particularités...etc...
    Pour encoder cette chaine je fais une boucle for avec pas mal de traitement dedans et à chaque début de boucle je regarde la valeur de l'itérateur de celle-ci par rapport à sa valeur max (ce qui me donne donc un pourcentage) et je fais

    progressbar->setValue(cePourcentage);
    


    Seulement elle ne se met à jour qu'à la fin de la boucle. ça ne me dérange pas pour des petites chaines, mes pour de grandes chaines dont l'encodage est de l'ordre de plusieurs minutes, c'est un peu plus génant de voir la barre vide et se remplir d'un coup à la fin.

    Merci de votre aide
    Mwaxou
    • Partager sur Facebook
    • Partager sur Twitter
      11 mai 2008 à 19:33:19

      Pourrait-on voir la boucle en question s'il te plait?
      • Partager sur Facebook
      • Partager sur Twitter
        11 mai 2008 à 20:07:31

        Pas de problème !
        J'allège un peu les portions d'encodage sinon ça prendrait de la place pour rien :
        dico2* MacCreight(char *chaine, QProgressBar* bar)
        {
        	/* L'algorithme prend en parametre une chaine de caractere
        	et retourne le pointeur vers l'arbre correspondant a la chaine de caractere
        	L'algorithme est celui realise par Mc Creight en 1976 */
        	
        	dico2 *Racine,*Noeud, *U;int av = 0,pourcent=-1;;
        	creernoeud2(&Racine);//On initialise l'arbre vec la racine
        	/*ici on utilise une varible pour avancer dans la chaine*/
        	clock_t	temps_initial, temps_final;
        	float temps_cpu; 
        	Noeud=Racine;
        	int avanc = 0, avanc2 = 0 , taille = 0 ,j;
        	temps_initial = clock ();
        	unsigned int az=strlen(chaine);
        	//std::cout << "la taille de la chaine est " << az << std::endl;
        	
        	for( unsigned int i = 0 ; i < az ; i++)
        	{
        		
        		if((i*100)/strlen(chaine)!=pourcent)
        		{
        			//system("clear");
        			//printf("\n [ %d%% ]\n",((i+1)*100)/strlen(chaine));
        			
        			pourcent=(i*100)/strlen(chaine);
        
                       /** C'EST ICI QUE L'ON FAIT AVANCER LA BARRE DE CHARGEMENT **/
        
        			bar->setValue(pourcent);
        		}
                /** ICI il  y a plein d'opération  : parcours d'arbre, additions, allocations de mémoire 
        
                 Dont un appel d'une autre fonction qui effectue des opérations sur l'arbre**/
        	
        	}
        	//std::cout <<"On sort de la boucle d'encodage" << std::endl;
        	*temps_final = clock ();
        
        	temps_cpu = (temps_final - temps_initial) ;
        	//printf("\n\nL'arbre s'est construit en %f secondes pour une taille de %d caracteres \n\n",(temps_cpu)/CLOCKS_PER_SEC,strlen(chaine));printf("\n\n\nArbre construit (appuyer sur entree)\n");
        	*/
        	//assert(Racine!=NULL);
        	
        	return Racine;
        }
        
        • Partager sur Facebook
        • Partager sur Twitter
          11 mai 2008 à 21:33:44

          Peut-etre que le probleme ne vient finalement pas de la : l'application est-elle bien mise a jour a chaque tour de boucle? Et si oui, je vois que tu fais un pourcentage, or par defaut la valeur doit etre comprise entre 0 et 100 et non entre 1 et 0. Est-ce moi qui ai mal compris ou bien as-tu utilisé un setRange()?
          • Partager sur Facebook
          • Partager sur Twitter
            12 mai 2008 à 1:08:25

            Pour se mettre à jour, ta Progress bar doit se redessiner.
            Or, rien ne se redessine dans ton appli parce qu'elle est mono thread, et que donc tant que ta boucle s'exécute, aucun évènement n'est traité, puisque le code de traitement des évènement est "plus loin".

            Execute ta boucle dans un thread à part
            • Partager sur Facebook
            • Partager sur Twitter

            QProgressBar

            × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
            × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
            • Editeur
            • Markdown