also irgendwie stehe ich auf dem Schlauch: kann man unter (k)ubuntu Linux mit Lazarus 0.9.24beta und FPC 2.2.0 einen Thread nicht beenden (unter Win XP funktioniert's!)?
Beispiel gefällig?
Code: Alles auswählen
TSimpleThread = class(TThread)
private
protected
procedure Execute; override;
public
constructor Create;
end;
{ TForm1 }
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
procedure FormClose(Sender: TObject; var CloseAction: TCloseAction);
procedure FormCreate(Sender: TObject);
private
{ private declarations }
aThread: TSimpleThread;
public
{ public declarations }
end;
var
Form1: TForm1;
implementation
constructor TSimpleThread.Create;
begin
FreeOnTerminate:=True;
inherited Create(true);
end;
procedure TSimpleThread.Execute;
begin
while not terminated do
begin
sleep(500);
suspend;
end;
end;
{ TForm1 }
procedure TForm1.FormCreate(Sender: TObject);
begin
aThread:=TSimpleThread.Create;
end;
procedure TForm1.FormClose(Sender: TObject; var CloseAction: TCloseAction);
begin
aThread.Terminate;
aThread.Free;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
aThread.Resume;
end;
Sobald man aber auch nur ein einziges Mal auf den Button geklickt hat, lässt sich das Formular nicht mehr schließen, das Programm hängt im FormClose bei aThread.Free.
Offensichtlich klemmt es bei TThread.WaitFor, denn wenn man ein aThread.WaitFor vor aThread.Free im FormClose einbaut, dann bleibt das Programm an der Stelle hängen.
Hat irgendwer einen funktionierenden Workaround? Oder hab ich etwas wesentliches übersehen?
greetz, Dets ...