Ich würde anstatt das FWorkEvent-
Handle als Semaphore erstellen.
Das Event hat hier den Nachteil, dass alle WorkerThreads losrennen, wenn das Event gesetzt wurde.
Ist die Anzahl der Jobs kleiner als die Anzahl der WorkerThreads, dann machen einige WorkerThreads eine sinnlose "Leerfahrt".
Bei einer Semaphore rennen nur so viele Threads los, wie nötig.
Du könntest Dir dazu ganz einfach 2 passende Methoden zum Hinzufügen von Jobs basteln.
Delphi-Quellcode:
procedure AddJob(
const aJob:
String);
begin
CriticalSection.Enter;
try
JobList.add(aJob);
ReleaseSemaphore(FWorkEvent,1,
nil);
finally
CriticalSection.leave;
end;
end;
end;
procedure AddJobList(
const aLobList:TStringList);
var i:integr;
begin
if not assigned(aJobList)
then exit;
if not aJobList.Count = 0
then exit;
// damit wir keine "0" Semaphore setzen >> gibt Exception
CriticalSection.Enter;
try
for i:= 0
to aJoblist.Count -1
do
begin
JobList.add(aJobList[i]);
end;
ReleaseSemaphore(FWorkEvent,aJoblist.Count,
nil);
finally
CriticalSection.leave;
end;
end;
So stellt du sicher, dass der "Count" seiner Semaphore genau so groß ist wie die Anzahl Jobs in der Jobliste.
Da kein WorkerThread losläuft, wenn der Count der Semaphore = 0 ist hast du die "Leerfahrten" der übrigen WorkerThreads gespart...
Grüße
Jens