Des boucles de plus en plus lentes... Que faire?

Résolu
cs_Pingouin57 Messages postés 67 Date d'inscription samedi 8 mai 2004 Statut Membre Dernière intervention 16 décembre 2007 - 9 sept. 2007 à 18:58
cs_Pingouin57 Messages postés 67 Date d'inscription samedi 8 mai 2004 Statut Membre Dernière intervention 16 décembre 2007 - 10 sept. 2007 à 19:12
Salut à tous,

Voici mon petit problème. Je développe actuellement un petit logiciel en delphi dans lequel j'inclus une boucle se répétant beaucoup de fois (l'execution peut durer quelques minutes), j'utilise la commande Refesh() et Redraw() dans la boucle pour actualiser l'affichage de la fenêtre (j'en ai d'ailleurs profité pour y mettre une progressbar qui indique l'avancement du bordel).
Aucun soucis jusque là, cependant, lorsque notre petit while commence à tourner, on peut constater que l'execution est de plus en plus lente (les calculs effectués dans chaque boucle sont généralement les mêmes à quelques choses près), de plus, si le refresh fonctionne au début, au bout de quelques secondes si on a le malheur de cliquer quelque part dans le programme celui-ci ne répond plus et continue à tourner. Il faut attendre la fin de la boucle pour que le programme réponde à nouveau. Grrr...

Je ne sais pas si il existe des techniques permettant d'éviter ce genre d'ennuis, que j'ai déja rencontré plusieurs fois auparavent sans parvenir à trouver de solution...

Merci à tous, Julien

6 réponses

florenth Messages postés 1023 Date d'inscription dimanche 1 août 2004 Statut Membre Dernière intervention 17 août 2008 3
9 sept. 2007 à 19:24
Salut !

Il y a un seul remède: le thread.
Mais ça rentre dans un autre domaine de prog', assez compliquà à mettre en oeuvre et à comprendre pour la première fois.

En tapant "thread" dnas le moteur de recherche, tu devrais trouver quelques pistes.
Et si tu as d'autres problèmes, n'hésites pas.

++
Flo

Ressources Delphi, sources, tutoriaux, actu, ...: www.mx-dev.nethttp://te%3C/body
3
florenth Messages postés 1023 Date d'inscription dimanche 1 août 2004 Statut Membre Dernière intervention 17 août 2008 3
10 sept. 2007 à 18:35
Eh eh  f0xi: le remplaçant des "grandes" boucles qui prennent trop de temps, c'est bien sur les threads !!!

ProcessMessages, ça va deux minutes. Mais c'est 15 fois moins souple et ça bouffe les ressources processeur pour rien (donc ça ralentit). Et puis, c'est plus compliqué qu'un thread bien mené.
Et en plus, ça résout pas 100% des problèmes qu'on pourrait avoir.

Ressources Delphi, sources, tutoriaux, actu, ...: www.mx-dev.nethttp://te%3C/body
3
cs_cantador Messages postés 4720 Date d'inscription dimanche 26 février 2006 Statut Modérateur Dernière intervention 31 juillet 2021 13
9 sept. 2007 à 19:22
fuites mémoires..
Et j'ai mis des 's', on ne sait jamais..
Et puis mettre un refresh dans une boucle c'est osé..

cantador
0
f0xi Messages postés 4205 Date d'inscription samedi 16 octobre 2004 Statut Modérateur Dernière intervention 12 mars 2022 35
9 sept. 2007 à 20:23
Sans code on peut pas t'aider.

d'ailleur je comprend pas que Flo t'oriente vers les threads ... comme ça ... sans voir de code.

tu dis que tu appel Refresh etc ... mais les refresh/redraw se mettent en file d'attente et plus tu en appel plus la queue se remplis!

faut appeler application.processmessages toutes les 5 boucles par exemple :

while ... do
begin
   code ...
   compteur := compteur + 1;
  if (compteur mod 5) = 0 then
    Application.ProcessMessage;
end;
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_Pingouin57 Messages postés 67 Date d'inscription samedi 8 mai 2004 Statut Membre Dernière intervention 16 décembre 2007
9 sept. 2007 à 20:50
Merci à vous pour ces infos, je vais tester l'utilisation de processmessages je vous tiens au courant
0
cs_Pingouin57 Messages postés 67 Date d'inscription samedi 8 mai 2004 Statut Membre Dernière intervention 16 décembre 2007
10 sept. 2007 à 19:12
Exact, j'ai en effet opté pour la solution du thread, cela parait être la meilleure solution dans ce genre de cas ^^
0
Rejoignez-nous