![]() |
VCL-Thread blockiert?
Hallo,
ich habe hier bei einem Program ein eigenartiges Phänomen. Ich habe einen VCL-Thread erstellt:
Delphi-Quellcode:
Und rufe ihn auf:
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;
Delphi-Quellcode:
Das OnTerminate fange ich ab:
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;
Delphi-Quellcode:
Das Beep aus dem BScanClick kommt sofort an - die Form blockiert aber solange, bis der thread fertig ist. Warum?
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; |
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. |
Re: VCL-Thread blockiert?
|
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 ;)
|
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:
nur ohne "erwartete Exceptions"?
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; |
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