Type TMessThread =
class(TThread)
private
FsLMesswertreihe: TStringList;
FiMessAnzahl,
FiMessabstand: integer;
procedure SetMessabstand(
const Value: Integer);
procedure SetMessanzahl(
const Value: Integer);
protected
procedure Execute;
override;
public
constructor create(CreateSuspended:Boolean);
reintroduce;
destructor destroy;
override;
property MesswertList: TStringList
read FsLMesswertreihe;
property Messanzahl:Integer
read FiMessanzahl
write SetMessanzahl;
property Messabstand:Integer
read FiMessabstand
write SetMessabstand;
end;
type
TForm1 =
class(TForm)
Memo1: TMemo;
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private-Deklarationen }
FMessthread:TMessthread;
procedure Messung(iMessreihen, iMesswerte, iMessabstand: Integer);
procedure GetMesswertList(Sender: TObject);
public
{ Public-Deklarationen }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.Messung(iMessreihen, iMesswerte, iMessabstand: Integer);
begin
FMessThread:= TMessThread.create(true);
FMessThread.Messanzahl:=iMessreihen * iMesswerte;
FMessThread.Messabstand:=iMessabstand;
FMessThread.OnTerminate := GetMessWertList;
FMessthread.FreeOnTerminate:=true;
FMEssthread.Resume;
//TempList.Messwertreihen := iMessreihen;
//TempList.Messwertanzahl := iMesswerte;
{ FMessThread.WaitFor; // Auf das Ende des Threads warten. Dieser löst die GetMesswertList-Procedure aus
}
//Wieso warten? Wozu dann der Thread, wenn du eh wartest und dein Programm lahm legst
end;
procedure TForm1.GetMesswertList(Sender: TObject);
begin
//was auch immer
Memo1.lines.Assign((Sender
as TMEssthread).MesswertList);
{TempList.FsLMesswertListe := TStringList.Create;
try
TempList.FsLMesswertListe.Assign(FMessThread.MesswertList); // mit dem Debugger komme ich zwar irgendwo in der CPU-Unit an aber der Restliche Quellcode wird nicht mehr bearbeitet. Das Programm bleibt aber funktionstüchtig. Sämtliche Resourcen werden NICHT freigegeben, dies habe ich mit FastMM nachvollzogen.
Form1.Memo1.Lines.Assign(FMessThread.MesswertList);
finally
FMessThread.Free;
TempList.FsLMesswertListe.Free;
Form1.Button1.Enabled := true;
end;}
end;
constructor TMessThread.create(CreateSuspended:boolean);
begin
inherited create(CreateSuspended);
FsLMesswertreihe := TStringList.create;
end;
destructor TMessThread.Destroy;
begin
FsLMesswertreihe.Free;
inherited destroy;
end;
procedure TMessThread.Execute;
var c, i: integer;
begin
for i := 1
to FiMessAnzahl
do
begin
c := GetTickcount;
//Das mit der Zeit ist noch komisch
FsLMesswertreihe.Add(floattostr(random));
c :=
{interval}FiMessabstand - (GetTickCount - c);
if c > 0
then Sleep(c);
end;
end;
procedure TMessThread.SetMessabstand(
const Value: Integer);
begin
FiMessabstand := Value;
end;
procedure TMessThread.SetMessanzahl(
const Value: Integer);
begin
FiMessanzahl := Value;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
Messung(10,5,100);
//collte ca. 5 Sekunden dauern, bis das Ergebnis da ist
end;