Einzelnen Beitrag anzeigen

Nils_13

Registriert seit: 15. Nov 2004
2.647 Beiträge
 
#13

Re: Thumbnails via Threads laden

  Alt 9. Jul 2008, 17:04
Ich finde zu WorkerThreadPool nichts. Ich habe die Bilder nicht im Speicher liegen. Denn das kostet schließlich am meisten Zeit. Beim Laden und Generieren lässt sich nichts mehr verbessern denke ich. Was wäre also am sinnvollsten ? Ich habe außerdem folgenden leicht fehlerhaften Code geschrieben, welcher wenigstens mal etwas funktioniert. Scheinen aber wirklich Fehler drinnen zu sein, die ich gerade nicht finde - gewisse Bilder sind einfach schwarz, wechselt man das Verzeichnis (ist ein Dateiverwaltungsprogramm) werden die Bilder nicht neu geladen usw. Scheint aber am ThumbnailDone zu liegen. Ich habe das Gefühl, es sei allgemein aber noch etwas instabil.
Delphi-Quellcode:
type
  TDone = procedure (Items : TDynItemArray) of object;
  TThumbnailThread = class(TThread)
  private
    fDone : TDone;
    procedure SyncDone;
  protected
    procedure Execute; override;
  public
    Items : TDynItemArray;
    Img : TImageList;
    property Done : TDone read fDone write fDone;
  end;

procedure TThumbnailThread.Execute;
var i : Integer;
    Picture : TPicture;
    Bmp : TBitmap;
begin
  try
    for i := 0 to High(Items) do
    begin
      try
        Picture := TPicture.Create;
        Picture.LoadFromFile(Items[i].Pfad+Items[i].Name);
        Bmp := TBitmap.Create;
        with Bmp do
        begin
          ...
          Img.Add(Bmp, nil);
          Items[i].ImageIndex := Pred(Img.Count);
          Free;
        end;
      except

      end;
      SyncDone;
    end;
  except
    on e: exception do
    begin

    end;
  end;
end;

procedure TThumbnailThread.SyncDone;
begin
  if Assigned(fDone) then
    fDone(Items);
end;

procedure TRazFileManager.LoadThumbnails;
var Thread : TThumbnailThread;
begin
  Thread := TThumbnailThread.Create(True);
  with Thread do
  begin
    Items := Thumbnails;
    Img := Img32;
    Done := ThumbnailDone;

    Resume;
  end;
end;

procedure TRazFileManager.ThumbnailDone(Items : TDynItemArray);
var i : Integer;
begin
  for i := 0 to High(Items) do
    DirsFiles[DirCount+Items[i].Index].ImageIndex := Items[i].ImageIndex;
end;
Edit: habe einen wichtigen Fehler gefunden und beseitigt. Nun scheint es ganz gut zu laufen.
  Mit Zitat antworten Zitat