Die Timer werden eingeschaltet sobald die gesamten Gruppen ferig definiert sind damit nicht ein timer in eine unfertige Definition reinfunkt.
Delphi-Quellcode:
savetimer := TSavetimer.create(dm.uniconn, server.OPCGroups[i]);
savetimer.Name := server.OPCGroups[i].Parent.Name + '_' + server.OPCGroups[i].Name;
savetimer.GroupNo := strtoint(rightstr(server.OPCGroups[i].Name, length(server.OPCGroups[i].Name)-2));
itdata := server.OPCGroups[i].opcitems[0].data;
savetimer.SInterval := itdata^.intervall;
savetimer.RInterval := itdata^.ReadIntervall;
savetimer.AInterval := itdata^.LimitIntervall;
savetimer.STimer.Interval := savetimer.SInterval;
savetimer.RTimer.Interval := 30000;
savetimer.Stimer.Enabled := true;
savetimer.Rtimer.Enabled := true;
Wie gesagt, der Code ist identisch mit dem in D7,am Ende der ganzen Aufruferei ist der Status enabled bei beiden Timern = true.
Das manuelle Aufrufen der Prozedur SaveTimerEvent funktioniert auch ohne Fehler.
@Photoner: Der Savethread braucht ein paar millisekunden und wird jedesmal wieder freigegeben (siehe hier):
Delphi-Quellcode:
procedure TSavetimer.SaveTimerEvent(sender: TObject);
var tr: TSaveThread;
begin
try
tr := TSaveThread.Create(self);
tr.FreeOnTerminate := false;
tr.execute;
repeat sleep(10) until tr.Terminated;
tr.Free;
except
//
end;
end;