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