Es fehlt ja das drumrum, deshabl kann ich nur raten:
1. Du rufst ja Deinen Task-Erzeuger ReadOpcData; anscheiend mit 100ms Intervallen auf
Delphi-Quellcode:
procedure TMaschine.OnPollTimer(Sender: TObject);
begin
ReadOpcData;
end;
wobei Du im Task selber 5000ms wartest.
Delphi-Quellcode:
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;
Deshalb erzeugst Du nicht einen Task, sondern Myriaden Tasks, die 5 Sek. warten, wenn der Timer frei läuft (wovon ich mal ausgehe).
Und deine Tasks laufen über ...
2. Aber abgesehen davon, ich vermute mal dass Du nur EINEN Task erzeugen darfst,
denn Du hast ja auch nur EINE Quell-Schnittstelle die Dir Daten liefert.
Deshalb solltest Du die Abfrage wohl irgendwie anders strukturieren.
3. Ich gehe davon aus dass in OnOpcData auch der UI-Thread angefasst wird.
Das würde dann irgendwann crashen, deshalb müsste man in FOnData( Self ) eine Synchronisation einbauen (TThread.Queue, TThread.Synchronize).
Delphi-Quellcode:
procedure TMaschine.OnOpcData;
begin
if Assigned(FOndata) then
FOnData(Self);
end;
4. Anscheinend versuchst Du im FOnData( Self ) wieder auf die Daten im Thread zuzugreifen ( zu holen ),
das muss auch besonders abgesichert werden, deshalb wäre es besser dem FOnData( Self, FMeineDaten ) direkt die Daten aus dem Thread zu übergeben.