unit Unit1;
interface
uses
Winapi.Windows,
Winapi.Messages, System.SysUtils, System.Variants, System.Classes,
Vcl.Graphics,
Vcl.Controls,
Vcl.Forms,
Vcl.Dialogs,
Vcl.StdCtrls;
type
TAnalyseThread =
class(TThread)
private
protected
procedure Execute;
override;
public
constructor Create(CreateSuspended: Boolean);
destructor Destroy;
override;
end;
type
TForm1 =
class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
procedure FormDestroy(Sender: TObject);
private
AnalyseThread: TAnalyseThread;
procedure OnAnalyseReady(Sender: TObject);
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
begin
if Assigned(AnalyseThread)
then
begin
FreeAndNil(AnalyseThread);
end;
AnalyseThread := TAnalyseThread.Create(True);
if Assigned(AnalyseThread)
then
begin
// neu, jetzt noch besser!
AnalyseThread.OnTerminate := OnAnalyseReady;
AnalyseThread.Start;
end;
end;
procedure TForm1.OnAnalyseReady(Sender: TObject);
begin
// Auswertung des Daten...
if Assigned(AnalyseThread)
then
begin
// Wir sind mit allen durch, aber können hier noch nicht freigeben, weil wir noch zu sehr im Sumpf
// des Synchronize drin sind (siehe procedure TThread.DoTerminate;). Darum noch ne Extra-Runde durch
// die Windows-Botschaftsbehandlung durch TThread.ForceQueue
TThread.ForceQueue(
nil,
procedure
begin
FreeAndNil(AnalyseThread);
end);
end;
end;
procedure TForm1.FormDestroy(Sender: TObject);
begin
if Assigned(AnalyseThread)
then
begin
FreeAndNil(AnalyseThread);
end;
end;
{ TAnalyseThread }
constructor TAnalyseThread.Create(CreateSuspended: Boolean);
begin
FreeOnTerminate := False;
inherited Create(CreateSuspended);
TThread.NameThreadForDebugging('
TAnalyseThread', Self.ThreadID);
end;
destructor TAnalyseThread.Destroy;
begin
inherited Destroy;
end;
procedure TAnalyseThread.Execute;
begin
// Tue irgendwas bis fertig...
end;
end.