Thema: TTask Frage

Einzelnen Beitrag anzeigen

Rollo62

Registriert seit: 15. Mär 2007
4.116 Beiträge
 
Delphi 12 Athens
 
#2

AW: TTask Frage

  Alt 24. Mai 2021, 18:19
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.
  Mit Zitat antworten Zitat