Das Speerobjekt brauchst du eigentlich nur in einer
Unit, da wo die Liste verwaltet wird. Letztlich muss die Liste ja auch allen die darauf zugreifen bekannt sein. Du könntest dies verhalten z.B. in einer eigenen
Unit kapseln (und die Liste umhüllen).
Dann hast einen Wrapper, der dir einfach sagt ob die Liste leer ist, der ein Objekt hinzufügen kann und wenn sie nicht leer ist dir das nächste Objekt zurück gibt. Beim erzeugen dieses Wrappers legst du eine Instanz Variable vom Typ TCriticalSection an, die dann immer gesperrt wird, bevor du ein Element in die Liste tust bzw. aus ihr entfernst:
Delphi-Quellcode:
type
TJobList = class(TObject)
private
FSyncObj : TCriticalSection;
FList : TObjectList;
public
constructor create;
destructor destrory; override;
procedure addJob(const Job : TBaseJob);
procedure getNextJob(out Job : TBaseJob);
function isEmpty : Boolean;
end;
// Konstruktor und Destruktor sind klar, erzeugen bzw. freigeben der Objekte
procedure TJobList.addJob(const Job : TBaseJob);
begin
self.FSyncObj.Acquire;
self.FList.Add(Job);
self.FSyncObj.Release;
end;
procedure TJobList.getNextJob(out Job : TBaseJob);
begin
self.FSyncObj.Acquire;
Job := TBaseJob(self.FList.Extract(self.FList[0]));
self.FSyncObj.Release;
end;
function TJobList.isEmpty : Boolean;
begin
self.FSyncObj.Acquire;
result := self.FList.Count > 0;
self.FSyncObj.Release;
end;