Bonjour,
Question déjà posée, mais pour laquelle je n'ai pas trouvé de réponse satisfaisante :
Je lance un Thread avec cette procédure, pour un traitement qui peut être très long, voire bloquant :
et j'essaye de l'arrêter avant la fin du traitement avec cette procédure :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10 var MThrd : TPersoThread ; ... { =============================================================== } procedure TF_Princ.ExecThreadClick(Sender: TObject); begin MThrd := TPersoThread.Create(True) ; MThrd.Execute ; MThrd.Free ; end;
Le Thread consiste à se connecter à un serveur, et à télécharger de nombreux fichiers :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8 procedure TF_Princ.StopThreadClick(Sender: TObject); begin TerminateThread(MThrd.Handle, 0); // Essai de Kill brutal du Thread : ne marche pas // Autres essais infructueux ... // MThrd.Destroy ; // MThrd.Suspend ; // MThrd.Terminate ; // ne fonctionne pas car je ne teste pas Terminated end;
il arrive que le traitement soit très long et que l'on veuille l'arrêter, même "brutalement". Je ne peux pas utiliser Terminate car il n'y a pas de boucle dans le Thread ou l'on peut tester Terminated. On peut faire un kill du Thread, car il n'y a pas de données à sauvegarder, mais il faudrait libérer les objets créés (?).
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55 unit Thread1 ; interface uses Windows, Classes, SysUtils, Forms, mmSystem ; type TPersoThread = class(TThread) private procedure CentralControl; public constructor Create(CreateSuspended:boolean); destructor Destroy; override; procedure Execute; override; protected end; implementation Uses Princ, MyHttp ; Var Aspirateur : TAspirateur; ListFic : TStringList ; { =============================================================== } constructor TPersoThread.Create(CreateSuspended:boolean); begin inherited Create(CreateSuspended) ; FreeOnTerminate := True ; Priority := tpNormal ; end; { =============================================================== } destructor TPersoThread.Destroy; begin //décharge la mémoire des objets If Aspirateur <> Nil Then FreeAndNil(Aspirateur) ; If ListFic <> Nil Then FreeAndNil(ListFic) ; inherited; end; { =============================================================== } procedure TPersoThread.CentralControl; begin // Traitement long, avec connection à un serveur et // Téléchargement de nombreux fichiers .... FreeAndNil(Aspirateur) ; F_Princ.MajBouton(True) ; end; end; { =============================================================== } procedure TPersoThread.Execute; begin Synchronize(CentralControl); end; { =============================================================== } end.
Comment faire, car TerminateThread n'a pas l'air de fonctionner ?
Merci
A+
Charly
Partager