Natürlich nur eine Skizze, trotzdem kann man verbessern:
Pseudocode:
Delphi-Quellcode:
// Workerthread
procedure TWorkerThread.Execute;
begin
...
MyCriticalSection.Enter;
try
DoSomethingWith(List[0]);
List.Delete(0);
finally
MyCriticalSection.Leave;
end;
...
Hupsa: Solange ein Job ausgeführt wird, ist die Liste bzw. der Zugriff auf Selbige blockiert. besser so:
Delphi-Quellcode:
// Workerthread
procedure TWorkerThread.Execute;
Function NextItemInList : ISomethingToDo;
begin
MyCriticalSection.Enter;
try
If List.Count>0 then begin
Result := List[0];
List.Delete(0);
else Result := nil;
finally
MyCriticalSection.Leave;
end;
end;
begin
...
DoSomethingWith(NextItemInList);
...
Jetzt ist nur das Extrahieren des ersten Elements der Jobliste exklusiv. 'DoSomethingWith' sollte nun noch prüfen, ob der übergebene Job <> nil ist.
Ich würde zudem noch eine Semaphore einführen und den Thread schlafen legen. Das 'AddItem' weckt ihn auf, indem die Semaphore per 'ReleaseSemaphore' um 1 erhöht wird. Damit rennt die Execute-Methode automatisch so lange, wie Jobs in der Liste sind.
Siehe auch:
http://www.delphipraxis.net/93835-wo...ntergrund.html