Danke für die Antwort, Sirius
Punkt 3 ist gut erklärt, jetzt habe ich eine bessere Vorstellung, was im Hintergrund beim Aufruf von Synchronize passiert.
Zu den drei anderen Punkten: Ich habe jetzt mal eine TThreadQueue (eigentlich eher eine TThreadObjectQueue, is aber zu lang xD) erstellt, die die CriticalSections enthält, nur bin ich nicht sicher, ob ich das so richtig verstanden und umgesetzt habe. (Hab versucht, mich an die TThreadList zu halten) Vor allem beim Destroy bin ich mir unsicher: Wer wäre jetzt für das Freigeben der noch vorhandenen Jobs verantwortlich? Die ThreadQueue selbst, weil sie diese ja "in Bearbeitung" hat, oder der TextureLoader, der die Jobs angelegt hat?
(Hatte mal was gehört von dort Freigeben, wo sie angelegt wurden, demnach müsste sich der TextureLoader drum kümmern.)
Delphi-Quellcode:
type
TThreadQueue = class(TObjectQueue)
private
FLock: TRTLCriticalSection;
public
constructor Create;
destructor Destroy; override;
function Push(AObject: TObject): TObject;
function Pop: TObject;
function Peek: TObject;
end;
[...]
constructor TThreadQueue.Create;
begin
inherited Create;
InitializeCriticalSection(FLock)
end;
destructor TThreadQueue.Destroy;
begin
EnterCriticalSection(FLock);
try
// Entweder die ThreadQueue kümmert sich ums freigeben, oder der TextureLoader muss es...
while (List.Count <> 0) do
(inherited Pop).Free;
inherited Destroy;
finally
LeaveCriticalSection(FLock);
DeleteCriticalSection(FLock);
end;
end;
function TThreadQueue.Push(AObject: TObject): TObject;
begin
EnterCriticalSection(FLock);
try
Result := inherited Push(AObject);
finally
LeaveCriticalSection(FLock);
end;
end;
function TThreadQueue.Pop: TObject;
begin
EnterCriticalSection(FLock);
try
Result := inherited Pop;
finally
LeaveCriticalSection(Flock);
end;
end;
function TThreadQueue.Peek: TObject;
begin
EnterCriticalSection(FLock);
try
Result := inherited Peek;
finally
LeaveCriticalSection(FLock);
end;
end;
Des weiteren verstehe ich den Punkt mit den Events nicht wirklich. Habe noch nie mit Events gearbeitet, und weiß somit nicht, wie ich das jetzt machen muss. Könntest du (oder jemand anderes
) einen Beispielcode geben? (Oder direkt in meine ThreadQueue einbauen, wäre noch besser
)
Nur soviel habe ich herausgefunden: WaitForSingleEvent gibts nicht, sollte wohl WaitForSingleObject heißen