Arret thread avec ExitThread

matsch77 Messages postés 3 Date d'inscription lundi 24 mars 2003 Statut Membre Dernière intervention 1 décembre 2003 - 28 nov. 2003 à 16:06
japee Messages postés 1727 Date d'inscription vendredi 27 décembre 2002 Statut Modérateur Dernière intervention 6 novembre 2021 - 2 déc. 2003 à 17:09
Bonjour,

le thread que je lance fait un très long calcul et je garde la main pour l'arreter. Donc pas possible de l'arreter avec Terminate.
En plus il écrit plein de fichiers qu'il faut supprimer ensuite (donc doivent être lisibles (thread completement arreter)

Exitthread arrete tout et je ne voit plus la fenêtre qui a lancé le thread (!?) (mais le projet et encore référencé dans la liste des exécutable qui tournent)
comment l'utilisé proprement (en revenant à la fenêtre de base)?

ou

si vous avez une autre solution? (peut-etre la gestion des exeption?)

merci beaucoup
:-)
Matsch77

5 réponses

japee Messages postés 1727 Date d'inscription vendredi 27 décembre 2002 Statut Modérateur Dernière intervention 6 novembre 2021 8
28 nov. 2003 à 18:40
Dans la partie protected du Thread, tu déclares :

procedure Termine;


puis, dans l'implementation :

procedure TonThread.Termine;
begin
  Stop := True;
end;


Dans la boucle de ton Thread, pour sortir :

if Stop then Exit;


Enfin, pour stopper ton Thread, tu appelles :

TonThread.Termine;
    TonThread.Free; // tu libères ton thread
0
cs_Delphiprog Messages postés 4297 Date d'inscription samedi 19 janvier 2002 Statut Membre Dernière intervention 9 janvier 2013 32
29 nov. 2003 à 11:28
L'appel de la méthode Terminate fait basculer la propriété Terminated du thread à True.
Donc, dans la méthode Execute du thread, tu peux exploiter cette information de la façon suivante :
while not Terminated do
begin
  //ton code ici
end;


De la manière, si ton code doit s'exécuter d emanière séquentielle et non en boucle, tu peux tester la valeur d ela propriété Terminated à tout instant:
//code avant  
if Terminated then Exit;
//code après
if terminated then exit;
//autre code après

Puisque tu dois supprimer des fichiers ensuite, il est souhaitable de prévoir une porte de sortie.
Ajoute une méthode dans la déclaration de la classe de ton thread :
  procedure ThreadTerminate;


Au début de la méthode Execute, tu déclares :
  OnTerminate := ThreadTerminate;


Cette méthode sera exécutée juste avant la destruction du thread et après l'exécution de la méthode Execute.
May Delphi be with you
0
matsch77 Messages postés 3 Date d'inscription lundi 24 mars 2003 Statut Membre Dernière intervention 1 décembre 2003
1 déc. 2003 à 14:16
Merci à tous les deux!

mais Delphiprog je n'ai pas réussi à donner à faire correspondre à Onterminate la méthode ThreadTerminate...

merci encore

Mathias
0
cs_Delphiprog Messages postés 4297 Date d'inscription samedi 19 janvier 2002 Statut Membre Dernière intervention 9 janvier 2013 32
1 déc. 2003 à 20:53
Apparemment, je n'ai pas été compris.
Alors voici, en clair, un exemple type :
Etape 1 : déclaration d'une méthode ThreadTerminate de type TNotifyEvent (compatible avec l'évènement OnTerminate)
type
TMathiasThread =  class(TThread)
private
{ Déclarations privées }
protected
procedure Execute; override;
procedure ThreadTerminate(Sender: TObject);
end;


Etape 2 : affectation de la procédure ThreadTerminate à l'évènement OnTerminate
procedure TMathiasThread.Execute;
begin
{ Affectation de la procédure ThreadTerminate}
OnTerminate : = ThreadTerminate;
end;


Etape 3 : implémentation de la méthode ThreadTerminate
procedure TMathiasThread.ThreadTerminate(Sender: TObject);
begin
{Cette proc sera exécutée avant destruction du thread. C'est donc ici que tu pourras procéder au nettoyage des fichiers}
end;


Je pense que tu avais dû oublier de déclarer la procédure ThreadTerminate avec un paramètre de type TObject.
Or, OnTerminate est déclaré de la façon suivante :
TThread.Onterminate : TNotifyEvent;


Et TNotifyEvent est déclaré ainsi :
TNotifyEvent: procedure(Sender: TObject) of Object;


Il suffisait donc de déclarer ta méthode ThreadTerminate avec les même paramètres :
procedure ThreadTerminate(Sender: TObject);


J'espère avoir éclairé un peu ta lanterne et celle de Japee, qui sait ? :)
May Delphi be with you
0

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

Posez votre question
japee Messages postés 1727 Date d'inscription vendredi 27 décembre 2002 Statut Modérateur Dernière intervention 6 novembre 2021 8
2 déc. 2003 à 17:09
Tu as complètement éclairé ma lanterne, Delphiprog !
Et si j'ai compris si vite, c'est que tu es un bon pédagogue, sois en sûr ;)
Merci à toi.
Bonne Prog' à toutes et à tous (et gare à la grippe et à la gastro, ça rôde... beeeuuuuurrrrkk) :dissapprove)
0
Rejoignez-nous