Thema: Delphi VCL-Thread blockiert?

Einzelnen Beitrag anzeigen

Benutzerbild von DGL-luke
DGL-luke

Registriert seit: 1. Apr 2005
Ort: Bad Tölz
4.149 Beiträge
 
Delphi 2006 Professional
 
#1

VCL-Thread blockiert?

  Alt 12. Jun 2006, 15:21
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?
Lukas Erlacher
Suche Grafiktablett. Spenden/Gebrauchtangebote willkommen.
Gotteskrieger gesucht!
For it is the chief characteristic of the religion of science that it works. - Isaac Asimov, Foundation I, Buch 1
  Mit Zitat antworten Zitat