Also generell kann man so etwas mit einem
TEvent lösen
Delphi-Quellcode:
type
TFoo = class
private
FThrottle : TEvent;
FCS : TCriticalSection;
procedure ReleaseThrottle;
public
constructor Create;
destructor Destroy; override;
procedure DoSomethingThrottled;
procedure DoSomethingDifferent;
end;
implementation
{ TFoo }
constructor TFoo.Create;
begin
inherited Create;
FThrottle := TEvent.Create( nil, False, False, '' );
end;
destructor TFoo.Destroy;
begin
FThrottle.Free;
FCS.Free;
inherited;
end;
procedure TFoo.DoSomethingDifferent;
begin
FCS.Enter;
try
// Aus der Liste holen
finally
FCS.Leave;
end;
ReleaseThrottle; // dem nächsten Thread den Zugang erlauben
end;
procedure TFoo.DoSomethingThrottled;
begin
if FThrottle.WaitFor = TWaitResult.wrSignaled
then
begin
FCS.Enter;
try
// In die Liste Legen
finally
FCS.Leave;
end;
end;
end;
procedure TFoo.ReleaseThrottle;
begin
FThrottle.SetEvent;
end;
Der Hauptthread ruft jetzt immer
DoSomethingDifferent
auf und alle SubThreads rufen
DoSomethingThrottled
auf.
Der Event sorgt dafür, dass immer nur ein Thread durchschlüpfen kann und der nächste Thread, wenn im
DoSomethingDifferent
das
ReleaseThrottle
aufgerufen wird.
Über Sinn und Unsinn mag ich hier jetzt nicht diskutieren, aber es geht
PS Die CriticalSection ist natürlich bei einer ThreadList unnötig
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ea 0a 4c 14 0d b6 3a a4 c1 c5 b9
dc 90 9d f0 e9 de 13 da 60)