procedure TForm2.Messung(iMessreihen, iMesswerte, iMessabstand: Integer);
begin
// in der Messung sollen iMessreihen * iMesswerte an Messpunkten aufgenommen, um
// diese später statistisch auszuwerten.
// Dafür Mesthread erstellen, der in regelmäßigen Abständen die entsprechende Anzahl
// an Messwerten aufnimmt.
FMessThread := TMessThread.create((iMessreihen * iMesswerte), iMessabstand);
try
FMessThread.OnMessWertListcompleted := GetMessWertList;
TempList.Messwertreihen := iMessreihen;
TempList.Messwertanzahl := iMesswerte;
FMessThread.WaitFor;
// Auf das Ende des Threads warten. Dieser löst die GetMesswertList-Procedure aus
except
FMessThread.Free;
end;
end;
procedure TForm2.GetMesswertList(Sender: TObject
{; List: TStringList});
var TempStringList: TStringList;
begin
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;
// Der TThread
Type TMessThread =
class(TThread)
private
FsLMesswertreihe: TStringList;
FiMessAnzahl, FiMessabstand: integer;
FCriticalSection: TCriticalSection;
FOnMessWertListcompleted: TOnMessWertListcompleted;
protected
// Ausführung
procedure Execute;
override;
// Setter und Getter
// Eventhandling
procedure DoMessWertListcompleted;
public
// Initialisierung und Terminierung
constructor create(iMessAnzahl, iMessabstand: integer);
reintroduce;
destructor destroy;
override;
property MesswertList: TStringList
read FsLMesswertreihe;
// Events
property OnMessWertListcompleted: TOnMessWertListcompleted
read FOnMessWertListcompleted
write FOnMessWertListcompleted;
end;
implementation
uses ControlerBoardForm;
constructor TMessThread.create(iMessAnzahl, iMessabstand: integer);
begin
inherited create(false);
FsLMesswertreihe := TStringList.create;
FOnMessWertListcompleted :=
nil;
FiMessAnzahl := iMessAnzahl;
FiMessabstand := iMessabstand;
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;
FsLMesswertreihe.Add(floattostr(Board.anaEingang[1]));
c :=
{interval}FiMessabstand - (GetTickCount - c);
if c > 0
then Sleep(c);
end;
doMessWertListcompleted;
// Event wird ausgelöst, damit die MesswertListe ausgelesen werden kann.
end;
procedure TMessthread.DoMessWertListcompleted;
begin
if assigned(FOnMessWertListcompleted)
then FOnMessWertListcompleted(Self
{, FsLMesswertreihe});
end;
end.