Bonjour, à tous
Pour les copies de fichiers, par exemple, j'utilise beaucoup les Threads API. J'ai écrit ce test de fin de Thread, lequel ne fonctionne pas.
Code du Thread (qui ne fait rien, d'ailleurs : c'est juste pour le test) :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 // Variables globales ThreadID : DWord; Handle_Thrd : THANDLE;
Je "tue" le Thread :
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 // Toutes les demies-secondes, un label affiche + ou - Function Thrd_Vide( lpParam : Pointer ) : LongWord ; stdcall ; Var i : integer; begin i := 0; while i < 1 do // Boucle infinie begin if AnsiCompareText(Form1.Lab_Aff_Thrd.Caption, '+') = 0 then begin Form1.Lab_Aff_Thrd.Caption := '-'; end Else begin Form1.Lab_Aff_Thrd.Caption := '+'; end; Sleep(500); end; // Pas de ExitThread(); C'est voulu : c'est peut-être une erreur, mais je veux pouvoir le stopper moi-même, pour le test. end;
Test de l'activité du Thread elle-même :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 procedure TForm1.Btn_StopClick(Sender: TObject); begin TerminateThread(Handle_Thrd, 0); end;
Problème : même après avoir tué le Thread, ma fonction me retourne systématiquement qu'il est actif. Ce qui est faux.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 procedure TForm1.Btn_Tst_ThrdClick(Sender: TObject); begin if Tst_Thrd_Actif(Handle_Thrd) = True then Aff_Ds_StatusBar('THREAD ACTIF', @Form1.StatusBar) Else Aff_Ds_StatusBar('THREAD TERMINE', @Form1.StatusBar) end;
Traduction de la doc de Microsoft au sujet de STILL_ACTIVE (un angliciste sera le bienvenu :
API GetExitCodeThread().
"Important. La fonction GetExitCodeThread renvoie un code d'erreur valide défini par l'application uniquement après la fin du thread.
Par conséquent, L'application ne doit pas utiliser STILL_ACTIVE (259) comme un code d'erreur.
Si un thread retourne STILL_ACTIVE (259) comme un code d'erreur, les applications qui testent
Pour cette valeur pourrait interpréter cela signifie que le thread est toujours en cours d'exécution et continuer à tester l'achèvement du thread après le thread "A terminé", ce qui pourrait mettre l'application dans une boucle infinie.
Et avec la fonction GetExitCodeProcess(), idem. Heu...
Partager