Das sollte kein riesiges Problem darstellen. TThread bietet die Möglichkeit, dem Hauptthread Arbeiten zuzuteilen, und zwar nicht blockierend wie bei Synchronize (Klassenmethode Queue). Da könntest du dann einfach immer ein Aktualisierungsroutine angeben. Am besten führst du einfach eine globale boolsche Variable ein: Sie hat den Status False, wenn die Routine gerade nicht in der Warteschlange steckt, ansonsten True. Am Anfang der Aktualisierungsmethode setzt du sie auf false und holst so viele Thumbnails wie möglich aus deiner Liste der fertigen Aufträge. Wenn ein Thread einen Auftrag bearbeitet hat, setzt er den Status der globalen Variable mit InterlockedExchange auf True und fügt, falls die Variable vorher den Wert False hatte, die Aktualisierungsroutine der Warteschlange hinzu.
Um das deutlich zu machen:
Delphi-Quellcode:
var GlobalFlag: Boolean;
procedure ThreadRoutine;
var Job: TThumbnailJob;
begin
while DequeueJob(JobsToDo, Job) do
begin
Job.Execute;
QueueJob(ExecutedJobs, Job);
if InterlockedExchange(Integer(GlobalFlag), Integer(True)) = Integer(False) then
TThread.Queue(nil, MyForm.UpdateListView);
end;
end;
procedure TMyForm.UpdateListView;
var Job: TThumbnailJob;
begin
GlobalFlag := false;
while DequeueJob(ExecutedJobs, Job) do
begin
AddThumbnailToListView(Job);
Job.Free;
end;
end;