Bonjour a tous,

J'aimerais attendre la fin de plusieurs threads, voici la méthode que j'utilise:

code exécutant les threads :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
 
var
  loop: Integer;
  nbThreadFini: Byte;
begin
  for loop:= 0 to FPlateaux.Count - 1 do
  begin
    with FPlateaux do
      TThreadPlateau.Create(Items[loop], NumPoint, nbThreadFini);
  end;
 
  repeat
    Application.ProcessMessages;
  until nbThreadFini = FPlateaux.Count;
Pour expliquer rapidement:
FPlateaux est une liste de plateau. Donc je crée un thread en lui passant le plateau (items[loop]), une variable NumPoint pour le traitement interne et une variable nbThreadFini pour déterminé le nombre de thread fini.

Voici le code du thread :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
 
TThreadPlateau=class(TThreadCustom)
  private
    FPlateau: TPlateau;
    FNumeroPoint: Integer;
    PThreadFini: PByte;
    procedure eventTerminate(Sender: TObject); override;
  protected
    procedure Execute; override;
  public
    constructor Create(Valeur: TPlateau; NumPoint: Integer; threadFini: Integer); reintroduce;
  end;
L'évènement EventTerminate est appelé quand le thread se termine et voici l'implémentation de ma classe :

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
 
constructor TThreadPlateau.Create(Valeur: TPlateau; numPoint: Integer; threadFini: Integer);
begin
  inherited Create;
  FNumeroPoint:= NumPoint;
  FPlateau:= Valeur;
  PThreadFini:= @threadFini;
  resume;
end;
 
procedure TThreadPlateau.Execute;
begin
  FPlateau.DemarrageActions(FNumeroPoint);
end;
 
procedure TThreadPlateau.eventTerminate(Sender: TObject);
var
  SectionCritique: TCriticalSection;
begin
  SectionCritique:= TCriticalSection.Create;
  SectionCritique.Enter;
  Inc(PThreadFini^);
  SectionCritique.Leave;
  SectionCritique.Free;
end;
Comme vous remarquez j'utilise un pointeur de la variable nbThreadFini que j'incrémente a la fin du thread dans une section critique.

Donc pour savoir si tous mes threads sont terminé je regarde que j'ai autant de threads finis que crées.

J'aurais voulu savoir si cette méthode est bonne et si il n'éxitait pas une meilleur méthode pour attendre la fin de tous mes threads ?