PhilLu
Messages postés251Date d'inscriptionlundi 9 novembre 2009StatutMembreDernière intervention11 mai 2021
-
21 mai 2007 à 19:42
PhilLu
Messages postés251Date d'inscriptionlundi 9 novembre 2009StatutMembreDernière intervention11 mai 2021
-
23 mai 2007 à 07:04
Salut,
Mon programme propose une solution qui s'approche de la réponse idéale à chaque itération.
Donc je ne peux pas donner de nombre d'itération à l'avance, mais l'utilisateur doit pouvoir décider quand arrêter la boucle en appuyant sur un bouton.
Je cherche une solution pour sortir de la boucle en cliquant sur le bouton, mais sans résultat! (pour le moment...)
Quelqu'un à une idée?
A+
PhilLU
f0xi
Messages postés4205Date d'inscriptionsamedi 16 octobre 2004StatutModérateurDernière intervention12 mars 202235 21 mai 2007 à 20:43
var
Stop : boolean = false; { control de sortie }
const
MaxItC = 1000000; { max d'iterations }
procedure Boucle;
var ItC : integer;
begin
{ init }
Stop := False;
ItC := 0;
{ boucle tant que Stop=False et ItC inferieur a MaxItc }
while (not Stop) and (ItC < MaxItC) do
begin
{ ... code ... }
Inc(ItC); { incremenation du compteur d'iteration }
if (ItC mod 5) = 0 then { toute les 5 iteration on appel ProcessMessages pour
ne pas bloquer le programme }
Application.ProcessMessages;
end;
end;
procedure TFormX.ButtonStopClick(Sender : TObject);
begin
{ simple comme bonjour }
Stop := true;
end;
cs_rt15
Messages postés3874Date d'inscriptionmardi 8 mars 2005StatutModérateurDernière intervention 7 novembre 201413 22 mai 2007 à 10:10
Salut,
Petite remarque au passage concernant un piège courant -> si tu as deux boutons, un pour démarrer la résolution et un pour la stopper en cours de résolution, avec le code de f0xi, les deux boutons deviennent utilisables en plein calcul.
Autrement dit, l'utilisateur peut démarrer un nouveau calcul avant que le précédent ne soit finit... Tout dépend de l'algo, mais cela peut avoir des conséquences facheuses, si il modifie une variable globale par exemple...
On peut désactiver temporairement les boutons avec leurs propriété enable.
f0xi
Messages postés4205Date d'inscriptionsamedi 16 octobre 2004StatutModérateurDernière intervention12 mars 202235 22 mai 2007 à 14:38
exact!
var
Stop : boolean = false; { control de sortie }
const
MaxItC = 1000000; { max d'iterations }
procedure Boucle;
var ItC : integer;
begin
{ init }
ItC := 0;
{ boucle tant que Stop=False et ItC inferieur a MaxItc }
while (not Stop) and (ItC < MaxItC) do
begin
{ ... code ... }
Inc(ItC); { incremenation du compteur d'iteration }
if (ItC mod 5) = 0 then { toute les 5 iteration on appel ProcessMessages pour
ne pas bloquer le programme }
Application.ProcessMessages;
end;
end;
procedure TFormX.ButtonStopClick(Sender : TObject);
begin
{ simple comme bonjour }
Stop := true;
PhilLu
Messages postés251Date d'inscriptionlundi 9 novembre 2009StatutMembreDernière intervention11 mai 2021 22 mai 2007 à 16:55
Merci pour les infos!!!
Si je comprend bien c'est le 'Application.ProcessMessages;' qui rend l'évennement click du bouton 'atteignable'.
Je teste ça asap!
Concernant le risque boutons multiples, je vais changer la fonction du bouton en fonction de son état 'Stop<->Start' comme ça pas de lézard.
A+
PhilLU
Vous n’avez pas trouvé la réponse que vous recherchez ?
PhilLu
Messages postés251Date d'inscriptionlundi 9 novembre 2009StatutMembreDernière intervention11 mai 2021 23 mai 2007 à 07:04
Même si je ne comprend pas encore comment, mais ça marche!
Il semble que l'appli ne stoppe pas immédiatement et qu'il faut cliquer longtemps sur le bouton.
La position de Application.ProcessMessages; semble critique.
De plus quand je clique sur une autre zone de l'appli, la routine de calcul se met en pause!?!
Encore merci!
A+
PhilLU