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 : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
 
  // Variables globales
  ThreadID : DWord;
  Handle_Thrd : THANDLE;
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
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;
Je "tue" le Thread :
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;
Test de l'activité du Thread elle-même :
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;
Problème : même après avoir tué le Thread, ma fonction me retourne systématiquement qu'il est actif. Ce qui est faux.

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...