Einzelnen Beitrag anzeigen

Apollonius

Registriert seit: 16. Apr 2007
2.325 Beiträge
 
Turbo Delphi für Win32
 
#4

Re: Thumbnails via Threads laden

  Alt 9. Jul 2008, 12:28
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;
Wer erweist der Welt einen Dienst und findet ein gutes Synonym für "Pointer"?
"An interface pointer is a pointer to a pointer. This pointer points to an array of pointers, each of which points to an interface function."
  Mit Zitat antworten Zitat