Hallo Forum,
ich habe eine Frage zu TTask.
Mein Task braucht länger wie der Task aufgerufen wird. Daraus resultiert ein Mehrfachaufruf des Tasks.
Ich möchte einen mehrfachen Aufruf vermeiden, weiß nur nicht so wie ich das realisieren kann. Mit TTask.Wait blockiere ich ja meine App
Vielen Dank schon mal für Eure tipps
Folgender Code:
Code:
(*** TMaschine *********************************************************************************************************************************************************************)
constructor TMaschine.Create(AOwner: TComponent);
begin
FOwner := AOwner;
PollTimer := TTimer.Create(FOwner);
PollTimer.Interval := FInterval;
PollTimer.OnTimer := OnPollTimer;
PollTimer.Enabled := False;
end;
destructor TMaschine.Destroy;
begin
PollTimer.Enabled := False;
TTask.WaitForAll(OpcTask);
inherited;
end;
procedure TMaschine.SetInterval(Value: Cardinal);
begin
FInterval := Value;
PollTimer.Interval := Value;
end;
procedure TMaschine.OnPollTimer(Sender: TObject);
begin
ReadOpcData;
end;
procedure TMaschine.SetHostIp(Value: TIpAdresse);
begin
FHostIp := Value;
end;
procedure TMaschine.SetActive(Value: Boolean);
begin
FActive := Value;
Maschinendaten.MaschineOnline := False;
PollTimer.Enabled := Value;
end;
procedure TMaschine.ReadOpcData;
begin
OpcTask := TTask.Create(procedure()begin
Inc(MaschinenDaten.TestCounter);
OnOpcData;
Delay(5000); // <- Ist nur ein "Zeitfresser", der die spätere OPC-Abfrage simuliert und länger ist wie das Timerinteval!
end);
OpcTask.Start;
end;
procedure TMaschine.OnOpcData;
begin
if Assigned(FOndata) then
FOnData(Self);
end;
Der Aufruf ist nun so:
Code:
procedure TForm1.FormShow(Sender: TObject);
begin
Maschine := TMaschine.Create(Self);
try
Maschine.Parent := Self.Parent;
Maschine.OnData := OnOpcData;
Maschine.PollInterval := 100; // <- Extra sehr kurz eingestellt um eine Zeitüberschneidung zu provozieren!
Maschine.Active := True;
except
// TODO
end;
end;
procedure TForm1.OnOpcData(Sender: TObject);
begin
Caption := (Sender as TMaschine).Maschinendaten.TestCounter.ToString;
end;
procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin
if Assigned(Maschine) then begin
Maschine.Active := False;
FreeAndNil(Maschine);
end;
end;