Pépin avec un stop et un thread... [Résolu]

Messages postés
93
Date d'inscription
jeudi 19 décembre 2002
Statut
Membre
Dernière intervention
25 octobre 2006
- - Dernière réponse : cs_manu00
Messages postés
93
Date d'inscription
jeudi 19 décembre 2002
Statut
Membre
Dernière intervention
25 octobre 2006
- 8 sept. 2004 à 19:39
Hello les pros :-)
J'ai un soucis que je n'arrive pas a resoudre...

Dans un thread, j'ai ceci...

procedure Mythread.Execute;
var i:integer;
begin
repeat
begin
form1.commande1(Sender);
form1.commande2(Sender);
sleep(strtoint(form3.Edit1.text)*1000);
end;
until (form1.stop=true);
form1.button1.Enabled:=true;
form1.button2.Enabled:=false;
end

En gros, j'ai un bouton STOP et START... Quand je clique sur START, ca lance la boucle du thread et ca respecte le timer edit3.text, c'est a dire NOMBRE DE SECONDES * 1000 (pour avoir des ms).

Mais quand je clique sur STOP, je me retrouve bloqué sur le sleep et je dois attendre les xx ms avant que les boutons se mettent en enabled/disabled et donc que je passe en MODE OFF (sorti de la boucle)

Savez vous comment faire pour que au moment ou je clique sur STOP, ca me stop immédiatement la boucle, y compris le sleep...

Merci de votre aide

Manu
Afficher la suite 

5 réponses

Meilleure réponse
Messages postés
323
Date d'inscription
jeudi 6 juin 2002
Statut
Membre
Dernière intervention
24 septembre 2008
1
3
Merci
Il n'est pas possible de casser ton sleep si tu es entrain de l'executé.
maintenant si tu désires écrire ton code plus proprement, je l'aurais écris de cette manière :

private
  iTempo : integer;

procedure Mythread.Commande;
begin
  form1.commande1(Sender);
  form1.commande2(Sender);
end;

procedure Mythread.InitTempo;
begin
   iTempo := StrToInt(form3.Edit1.text) * 1000;
end;

procedure Mythread.Execute;
begin
  while not Terminated do
     if not form1.stop then
     begin     
       Synchronize(Commande);
       Synchronize(InitTempo);
       Sleep(iTempo);
     end;
  end;
end;

// Dans le ta form1 tu change l'état de tes bouttons lorsque tu clique dessus.
Procedure Tform1.Button1Click(Sender: TObject);
begin
  stop := False;
  button1.Enabled := False;
  button2.Enabled := True;
end;

Procedure Tform1.Button2Click(Sender: TObject);
begin
  stop := True;
  button1.Enabled := True;
  button2.Enabled := False;
end;


Je pense que l'on peux encore amélioré, mais déjà tu n'auras plus besoin d'attendre la fin du sleep pour basculer les bouttons 1 et 2 dans leur état inverse.
Deplus la méthode que tu utilisais, t'empêchais de relancer ton thread ??? sauf si tu appelais la procedure Execute de ton thread, mais je ne pense pas que se sois vraiment comme ça que l'on utilise un thread :-p

Bonne Prog,

Olivier.

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 123 internautes nous ont dit merci ce mois-ci

Commenter la réponse de Loulibier
Messages postés
323
Date d'inscription
jeudi 6 juin 2002
Statut
Membre
Dernière intervention
24 septembre 2008
1
0
Merci
Salut manu00,

Si c'est le code de l'execute de ton thread, je reste septique sur le bon fonctionnement de ton application, mais qui sais, peut être est-ce bon. ;)
Si tu ne souhaites pas attendre le sleep avant de quitter ta boucle lorsque tu clique sur le bouton STOP, il te suffit de mettre la condition if not form1.stop then juste avant ton sleep.

ce qui donne :
procedure Mythread.Execute;
var i:integer;
begin
repeat
begin
form1.commande1(Sender);
form1.commande2(Sender);
if not form1.stop then 
  sleep(strtoint(form3.Edit1.text)*1000);
end;
until (form1.stop=true);
form1.button1.Enabled:=true;
form1.button2.Enabled:=false;
end


Comme ça tu n'executeras ton sleep que si tu n'as pas appuyé sur ton bouton STOP.

Bonne Prog ;) ,

Olivier.
Commenter la réponse de Loulibier
Messages postés
323
Date d'inscription
jeudi 6 juin 2002
Statut
Membre
Dernière intervention
24 septembre 2008
1
0
Merci
Je ragardais ton code après l'avoir copier et je me rend compte que tu met du code qui ne sert à rien ;)

procedure Mythread.Execute;
var 
  i : integer;
begin
  // Le begin et end ne sont pas nécessaire entre repeat et until.
  repeat
     form1.commande1(Sender);
     form1.commande2(Sender);
  
     if not form1.stop then 
       sleep(strtoint(form3.Edit1.text)*1000);
  until (form1.stop=true);

  form1.button1.Enabled:=true;
  form1.button2.Enabled:=false;
end
Commenter la réponse de Loulibier
Messages postés
93
Date d'inscription
jeudi 19 décembre 2002
Statut
Membre
Dernière intervention
25 octobre 2006
0
Merci
Je suis d'accord avec toi pour le
if not form1.stop then
sleep(strtoint(form3.Edit1.text)*1000);

mais quand je clique sur STOP, et que le thread est en plein sleep, il faut que j'attende que celui ci soit fini avant effectivement que la boucle soit rompue. Je voudrais "casser" le sleep au moment meme ou je clique sur stop...

Merci de ton aide en tt cas
M.
Commenter la réponse de cs_manu00
Messages postés
93
Date d'inscription
jeudi 19 décembre 2002
Statut
Membre
Dernière intervention
25 octobre 2006
0
Merci
Merci infiniement Loulibier !!! Tout fonctionne grace a ta solution :-)

Thx !!!
et bonne continuation !!

M.
Commenter la réponse de cs_manu00