Zumindest das Beispiel aus der
OH ist nicht wirklich selbsterklärend:
Delphi-Quellcode:
Event1.ResetEvent();
{ Ereignis vor der Ausführung der Threads zurücksetzen }
for i := 1
to Counter
do
TaskThread.Create(False);
{ Aufgaben-Threads erzeugen und ausführen }
if Event1.WaitFor(20000) <> wrSignaled
then
raise Exception;
{ nun den Haupt-Threads fortsetzen Alle Aufgaben-Threads sind beendet }
Hier in dem Beispiel werden mehrere Threads erzeugt. Woher weiß das Event, dass alle fertig sind?
Der Letzte macht das Licht aus
Das steht weiter oben im Beispiel der
OH:
Delphi-Quellcode:
procedure TDataModule.TaskTerminateThread(Sender: TObject);
begin
...
CounterGuard.Acquire;
{ Zähler mit einer Sperre belegen }
Dec(Counter);
{ Wert der globalen Zählervariable verringern }
if Counter = 0
then
Event1.SetEvent;
{ Signalisieren, ob es der letzte Thread ist }
Counter.Release;
{Sperre vom Zähler entfernen}
...
end;
Der Counter wird im OnTerminate eines jeden Threads heruntergezählt (mit critical section versteht sich!). Wenn 0 erreicht ist, weiß der Thread, dass er der letzte ist und macht das Lich aus (SetEvent).