 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
|
 Groupe : Membres
|
Pourrait-on voir la boucle en question s'il te plait?
La bonne santé est la plus lente façon de mourir.
|
 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
|
 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.
|
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
|