Bonjour a tous,
J'aimerais attendre la fin de plusieurs threads, voici la méthode que j'utilise:
code exécutant les threads :
Pour expliquer rapidement:
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;
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 :
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 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;
Comme vous remarquez j'utilise un pointeur de la variable nbThreadFini que j'incrémente a la fin du thread dans une section critique.
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;
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 ?
Partager