Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi VCL-Thread blockiert? (https://www.delphipraxis.net/71279-vcl-thread-blockiert.html)

DGL-luke 12. Jun 2006 14:21


VCL-Thread blockiert?
 
Hallo,

ich habe hier bei einem Program ein eigenartiges Phänomen.

Ich habe einen VCL-Thread erstellt:

Delphi-Quellcode:
type
  TFindFilesThread = class(TThread)
  private
    { Private-Deklarationen }
  public
    Files: TStrings;
    folder: string;
    attribs: Integer;
  protected
    procedure Execute; override;
  end;

procedure TFindFilesThread.Execute;
begin
  Files := GetFolder(folder,attribs);
end;
Und rufe ihn auf:

Delphi-Quellcode:
procedure TForm2.BScanClick(Sender: TObject);
begin
  if DirectoryExists(EPath.Text) then
    begin
      with TFindFilesThread.Create(true) do
        begin
          folder := EPath.Text;
          attribs := faAnyFile;
          OnTerminate := OnThreadTerminate;

          Resume;
        end;
      Anim.Active := true;
    end
  else
    ShowMessage('Bitte gültigen Pfad angeben!');

  Beep;
end;
Das OnTerminate fange ich ab:

Delphi-Quellcode:
procedure TForm2.OnThreadTerminate(Sender: TObject);
var b: TBitmap32;
    s: string;

begin
  BList.Bitmaps.Clear;

  for s in (Sender as TFindFilesThread).Files do
        try
          b := TBitmap32.Create;
          b.LoadFromFile(EPath.Text + '\' + s);
          BList.Bitmaps.Add.Bitmap.Assign(b);
          ImageNames.Add(s);
        except
          Continue;
        end;
  LNumFiles.Caption := inttostr((Sender as TFindFilesThread).Files.Count);
  LNumImages.Caption := inttostr(BList.Bitmaps.Count);

  if BList.Bitmaps.Count > 0 then
    begin
      BFirst.Enabled := false;
      BPrev.Enabled := false;
      BNext.Enabled := true;
      BLast.Enabled := true;

      LImagePos.Caption := '0';

      BFirst.Tag := 0;
      BPrev.Tag := 0;
      BNext.Tag := 1;
      BLast.Tag := BList.Bitmaps.Count -1;

      ISlide.Bitmap.Assign(BList.Bitmap[0]);
      LFilename.Caption := ImageNames[0];
    end;

  Anim.Active := false;

  PostMessage(Handle,WM_THREADFREE,Integer(Sender),Integer(Sender));
end;
Das Beep aus dem BScanClick kommt sofort an - die Form blockiert aber solange, bis der thread fertig ist. Warum?

shmia 12. Jun 2006 14:29

Re: VCL-Thread blockiert?
 
FindFiles benötigt nur wenig Zeit; dein Thread terminiert wahrscheinlich schon nach weniger als 100ms. (alles schon im Cache)
Das Laden von einigen Bitmaps braucht im Vergleich mehrere Sekunden und wird im Hauptthread ausgeführt.
Und solange blockiert dieser eben.

DGL-luke 12. Jun 2006 14:32

Re: VCL-Thread blockiert?
 
:wall:

na klar... :roll:

Dann hilf mal Mazel hier, ich dachte da wärs das selbe Problem :)

himitsu 12. Jun 2006 15:06

Re: VCL-Thread blockiert?
 
Die Lösung deines Problems sollte demnach auch klar sein ... lagere das Laden der Bilder ebenfalls mit in den Thread aus ;)

DGL-luke 12. Jun 2006 15:34

Re: VCL-Thread blockiert?
 
aber klar doch, hab ich auch gemacht.

Könnte es sein, dass das Exception-Handling trotzdem irgendwie "durchschlägt"? Denn seitdem ich zusätzlich eine Abfrage nach Extensions eingeführt habe, läuft es erkennbar runder...

(Ich hab ein TAnimate auf der Form, das zwischendurch stockte.. setidem ich die Exceptions verhindere, eben nicht mehr.)

Gibt es eine Möglichkeit, ohne Exceptions abzufragen, ob eine Datei zu einer der TPicture/TGraphic-Erweiterungen kompatibel ist, sprich geladen werden kann? Also sowas wie:



Delphi-Quellcode:
for s in (Sender as TFindFilesThread).Files do
        try
          b := TBitmap32.Create; //Speicherleck :shock:
          b.LoadFromFile(EPath.Text + '\' + s);
          BList.Bitmaps.Add.Bitmap.Assign(b);
          ImageNames.Add(s);
        except
          Continue;
        end;
nur ohne "erwartete Exceptions"?


Alle Zeitangaben in WEZ +1. Es ist jetzt 07:20 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz