Problème de timer/progressbar C++Builder

Tom59247 Messages postés 27 Date d'inscription jeudi 7 janvier 2010 Statut Membre Dernière intervention 7 février 2013 - 13 avril 2010 à 21:55
cs_rt15 Messages postés 3874 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 7 novembre 2014 - 1 mai 2010 à 19:19
Bonsoir tout le monde,

dans le cadre d'un projet, je dois réaliser une interface graphique qui devra évoluer en fonction d'information reçu par un automate.(Station de surpression, gére la demande en eau de plusieurs utilisateurs .. bref)

j'ai un soucis dans la progression d'une ProgressBar celle ci doit évoluer en fonction de la pression (demande des utilisateurs, plus il y a de demande , plus la pression montera ou inversement)

j'ai reussi a la faire évoluer mais c'est beaucoup trop long la barre ne progresse pas assez vite je souhaiterais une barre un poil plus fluide...
Je vous link mon code afin de visualiser un peu mieux mon problème

if(Edit_Preseuil->Text.ToInt() < Edit_Pression->Text.ToInt())
                {      
                        //boucle pour augmenter la pression
                        for(int i=Edit_Preseuil->Text.ToInt();i<Edit_Pression->Text.ToInt();i++)
                        {
                                Manometre->Position = i;
                                Sleep(1);     //probleme l'avancement du progressbar n'est pas assez rapide
                        }
                        //Réaction a l'augmentation de la pression sans reel importance pour ma question
                        //juste que dans les méthodes appelés entraine un autre timer que celui qui fait progressé le manometre
                        Timer_Pompe1->Enabled=true;
                        for(int i=0;i<=4;i++)
                                IHM_Syn->TabVanne1[i].VanneUp();

                        //la progressbar(Manometre) doit réduire car "le moteur" se met en marche
                        for(int u=Edit_Pression->Text.ToInt();u>Edit_Preseuil->Text.ToInt();u--)
                        {
                                Manometre->Position = u;
                                Edit_Pression->Text = u;
                                Sleep(1);
                        }
                }


(en réalité le code doit SI la pression est plus haute que la pression de seuil, la progressbar augmente puis le moteur se met en route et enfin la progressBar doit revenir a la pression de seuil)

donc voilà le premier problème avec le manometre, le second probleme est que le code entre les 2boucles FOR (Timer_pompe et la methode Vanne_up) ne se lance qu'a la fin de ma 2em boucle FOR est là je ne comprends pas pourquoi ...

Si quelqu'un peut m'éclairer, ca m'aiderait énormement :)

Bonne soirée

4 réponses

BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
14 avril 2010 à 07:37
for(int i=Edit_Preseuil->Text.ToInt();i<Edit_Pression->Text.ToInt();i++)
A chaque tour de boucle tu relis le texte de l'EDIT et tu le transformes en 1 entier, faut pas s'étonner que ce n'est pas rapide.

Ce n'est pas avec ce genre de sabir que tu apprendras à coder efficace.
i = Edit_Pression->Text.ToInt();
Manometre->Position = i - 1;
Devrait donner le meme resultat.

ciao...
BruNews, MVP VC++
0
Tom59247 Messages postés 27 Date d'inscription jeudi 7 janvier 2010 Statut Membre Dernière intervention 7 février 2013
14 avril 2010 à 10:56
Salut BruNews, merci de regarder à mon soucis,

en réalité ce n'est pas la boucle qui est trop longue car si j'enleve le sleep mon programme tourne en instantanné, c'est juste que "sleep(1)" est encore trop long car ma pression de seuil sera par exemple de 2000 et ma pression sera de 4000 ce qui fait 2000 itérations dans ma boucle.

j'ai effectué un petit test pour bien observer que ca marche
                        for( i=Edit_Preseuil->Text.ToInt();i<Edit_Pression->Text.ToInt();i++)
                        {
                                Manometre->Position = i;
                                if(test == 10)
                                {
                                        Sleep(1);     //probleme l'avancement du progressbar n'est pas assez rapide
                                        test = 0;
                                }
                                else
                                        test ++;


dans ce cas là ma barre charge comme il faut... mais déjà que mon code fait débutant là c'est encore un niveau en dessous :/

j'aurais souhaité un moyen de faire une sorte de "sleep(1/10) ou sleep(0.1)" mais d'apres ce que j'ai constaté c'est exactement comme si je ne mettais pas de timer...
Auriez vous une alternative au probleme ? autre chose que le test que je viens de mettre :/

Merci d'avance.
0
Tom59247 Messages postés 27 Date d'inscription jeudi 7 janvier 2010 Statut Membre Dernière intervention 7 février 2013
16 avril 2010 à 18:53
Re bonjour,

personne n'a de conseils à me donner ? :/
0
cs_rt15 Messages postés 3874 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 7 novembre 2014 13
1 mai 2010 à 19:19
Salut,

Heu bin tu peux avancer plus vite que de 1 en 1 peut être.

                        for( i=Edit_Preseuil->Text.ToInt();i<Edit_Pression->Text.ToInt();i += 10)
                        {
                                Manometre->Position = i;
                                Sleep(1);     //probleme l'avancement du progressbar n'est pas assez rapide


Et effectivement, exécuter une seule fois Edit_Pression->Text.ToInt() avant la boucle serait beaucoup plus propre, même si ça ne résout pas ton problème.
0
Rejoignez-nous