Thema: Delphi Form.ShowModal im Thread

Einzelnen Beitrag anzeigen

gmc616

Registriert seit: 25. Jun 2004
Ort: Jena
627 Beiträge
 
Delphi 10.3 Rio
 
#1

Form.ShowModal im Thread

  Alt 6. Dez 2007, 00:24
Guten Abend DP,

ich fange an mich mit Threads zu beschäftigen. Die ersten paar Threads hab ich auch schon erfolgreich hin gekriegt. So werden in meinem MP3-Player die ID3-Tags in einem Thread ausgelesen und in ein Listview geschrieben. Ob das ganze thread-safe ist weiß ich nicht, aber es funktioniert prima.

Nun möchte ich einen Schritt weiter gehen, und zwar ein Suche-Dialog in einem Thread laufen lassen.

Hintergrund: Auf meinem Hauptfenster wird über einen Timer eine Animation berechnet und dargestellt.
Wenn ich in meinem Suche-Dialog eine Suche starte, animiert meine Animation nicht mehr, da das Suchen die Anwendung blockiert. Klar könnte ich ein ProgressMessages in meine Suche-Funktion einbauen, ist aber nicht Ziel der Sache.

Nun hab ich mir diese Konstruktion in einem Test-Programm zusammen gebastelt.

Delphi-Quellcode:
Type TMyDlgThread = class (TThread)
  private
    FDlg : TMySearchDlg;
    FModalResult : TModalResult;
  public
    Constructor Create(CreateSuspended: Boolean); overload;
    Destructor Destroy (); overload;

    function ShowDlg () : TModalResult;

  protected
    procedure Execute; override;
  end;


constructor TMyDlgThread.Create(CreateSuspended: Boolean);
begin
  inherited;
  self.FreeOnTerminate := false;
  FDlg := TMySearchDlg.Create(nil);
end;

destructor TMyDlgThread.Destroy;
begin
  FDlg.Free;
  inherited;
end;

procedure TMyDlgThread.Execute;
begin
  inherited;
  FModalResult := FDlg.ShowModal;
end;

function TMyDlgThread.ShowDlg: TModalResult;
begin
  Resume;
  WaitFor;
  Result := FmodalResult;
end;
Das ganze endet so, dass mein Suche-Dialog angezeigt wird und dann das ganze Programm stehen bleibt. Nichts geht mehr. Einfach tot, ohne Fehlermeldung und ohne CPU-Last. Nichts!

Was mach ich falsch? Und wie macht man's richtig?

Danke
  Mit Zitat antworten Zitat