mh also ich habe nun folgendes. das ist nicht perfekt, aber besser kann ich es nicht:
Delphi-Quellcode:
// ...
uses Unit4;
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject); // thread starten und in liste einfügen
begin
ThreadList.Add(TTestThread.Create(Label1));
end;
procedure TForm1.Button3Click(Sender: TObject); // thread beenden (?!) und aus liste nehmen
begin
ThreadList.Delete(0);
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
ThreadList := TObjectList.Create;
end;
procedure TForm1.FormDestroy(Sender: TObject);
begin
ThreadList.Free;
end;
meine thread-klasse:
Delphi-Quellcode:
unit Unit4;
interface
uses
System.Classes, StdCtrls, SysUtils;
type
TTestThread =
class(TThread)
private
FMeinString:
String;
Flbl: TLabel;
{ Private-Deklarationen }
protected
procedure Execute;
override;
public
constructor Create(lb: TLabel);
virtual;
end;
implementation
uses Unit1;
{ TTestThread }
constructor TTestThread.Create(lb: TLabel);
begin
inherited Create(False);
FMeinString := '
X';
Flbl := lb;
end;
procedure TTestThread.Execute;
var
i: Integer;
begin
Randomize;
while not Terminated
do
begin
for i := 0
to 9
do
if Terminated
then
break
else
sleep(1000);
Flbl.Caption := IntToStr(Random(1000));
Synchronize(Form1.Update);
end;
end;
end.
erklärung zum sleep:
ich lasse meinen thread pro schleifendurchlauf (while) eine bestimmte zeit schlafen. damit ich ihn aber nicht "einfriere" und auf einen klick auf einen button, welcher den thread beenden soll, reagieren kann, warte ich
10 mal 1 Sekunde statt
1 mal 10 Sekunden