Aller au menu - Aller au contenu

[Plan du site] Vous êtes ici --- > Le Site du Zéro > Les forums > Programmation > Langage C++ > QProgressBar > Lecture du sujet

QProgressBar

Ne se met pas à jour

Vous devez être inscrit pour pouvoir poster des messages

Page : 1 
Auteur Message
1 visiteur sur ce sujet (1 anonyme)
Page : 1 
Hors ligne Mwaxou # Posté le 11/05/2008 à 19:28:20
Avatar
Groupe : Membres
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

Code : C++
1
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

Config:
MacBook Core 2 duo Santa Rosa 2Ghz, 4Go de ram, 250Go de DD
Mac OS 10.5.2, Ubuntu 7.10, Windows XP Pro

xCode 3.1b, NetBean, eclipse
 
Hors ligne Hauru # Posté le 11/05/2008 à 19:33:19
Avatar
Groupe : Membres
Pourrait-on voir la boucle en question s'il te plait?

La bonne santé est la plus lente façon de mourir.
 
Hors ligne Mwaxou # Posté le 11/05/2008 à 20:07:30
Avatar
Groupe : Membres
Pas de problème !
J'allège un peu les portions d'encodage sinon ça prendrait de la place pour rien :
Code : C++
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
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;
}

Config:
MacBook Core 2 duo Santa Rosa 2Ghz, 4Go de ram, 250Go de DD
Mac OS 10.5.2, Ubuntu 7.10, Windows XP Pro

xCode 3.1b, NetBean, eclipse
 
Hors ligne Hauru # Posté le 11/05/2008 à 21:33:44
Avatar
Groupe : Membres
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()?

La bonne santé est la plus lente façon de mourir.
 
Hors ligne Spaz # Posté le 12/05/2008 à 01:08:25
Groupe : Membres
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

Retour au forum "Langage C++" ou à la liste des forums

Vous devez être inscrit pour pouvoir poster des messages

Changer de design | En savoir plus | Plan du site | Politique d'accessibilité | Règles | RSS tutoriels | RSS news | XHTML 1.0 | CSS 2.0
Édité par Simple IT SARL : Nous contacter | Revue de presse | Publicité

Y'a plus rien à lire, faut remonter maintenant !

Hébergement web - Correction de tutoriels - Créer un site
Vous souhaitez apparaître ici ? Contactez-nous.

Nombre de connectés 119 Zéros connectés | Requêtes SQL 8 requêtes | Temps de génération de la page : Total (SQL) 0.0879s (0.074s)