![]() |
Unterschiede TTimer zwischen Delphi 7 und 2010?
Hallo,
ich habe ein merkwürdiges Problem beim Wechsel eines Programms von D7 auf D2010. Das Programm ist komplett identisch übernommen, lediglich einige Komponenten für OPC-Zugriffe sind aktualisiert. Im Programm werden verschiedene Timer erstellt, die den Aufruf unterschiedlicher Erfassungsgruppen steuern. Die Timer sind jeweils in einer Klasse zusammengefasst.
Delphi-Quellcode:
Die Timer sind den Gruppen über einen entsprechenden Pointer zugeordnet. D7 läuft seit Jahren problemos, D2010 löst keine Timer aus.
TSavetimer = class(TComponent)
private STimer: TTimer; RTimer: TTimer; SInterval: integer; RInterval: integer; AInterval: integer; public constructor create(conn: TUniconnection; aSaveObj: TdOPCGroup); destructor destroy; procedure SaveTimerEvent(sender: TObject); procedure ReadTimerEvent(sender: TObject); end; constructor TSavetimer.create(conn: TUniconnection; aSaveObj: TdOPCGroup); begin inherited create(application); SaveObj := aSaveObj; STimer := TTimer.Create(self); STimer.Enabled := false; STimer.OnTimer := SaveTimerEvent; RTimer := TTimer.Create(self); RTimer.Enabled := false; RTimer.OnTimer := ReadTimerEvent; end; 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; Hat irgendjemand einen Tipp? |
AW: Unterschiede TTimer zwischen Delphi 7 und 2010?
Da fehlt noch was.
Delphi-Quellcode:
Wo werden die Timer aktiviert? Was für ein Intervall? Wird mehrfach dein Savethread erzeugt obwohl du ihn nur einmal brauchst?
..Timer.Enabled := False;
Mehr Fragen als Antworten :) |
AW: Unterschiede TTimer zwischen Delphi 7 und 2010?
Wo werden die Timer denn eingeschaltet? (Enabled := true)
edit: zu spät |
AW: Unterschiede TTimer zwischen Delphi 7 und 2010?
Die Timer werden eingeschaltet sobald die gesamten Gruppen ferig definiert sind damit nicht ein timer in eine unfertige Definition reinfunkt.
Delphi-Quellcode:
Wie gesagt, der Code ist identisch mit dem in D7,am Ende der ganzen Aufruferei ist der Status enabled bei beiden Timern = true. 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; 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; |
AW: Unterschiede TTimer zwischen Delphi 7 und 2010?
Stutzig macht mich, dass RTimer und STimer eigentlich private sind, du aber trotzdem von außen auf diese zugreifst, ist das denn alles in einer Unit? Weil sonst dürfte das nicht gehen.
|
AW: Unterschiede TTimer zwischen Delphi 7 und 2010?
Ja, das steht alles in einer unit.
Ausserdem sind die Timer ja der einen globalen Komponente zugeordnet in der der gesamte Ablauf stattfindet. Die Prozeduren sind SaveTimerEvent(sender: TObject); ReadTimerEvent(sender: TObject); sind public |
AW: Unterschiede TTimer zwischen Delphi 7 und 2010?
OT: Ist TSaveThread wirklich eine Ableitung von TThread? Dann finde ich die Verwendung - insbesondere den Aufruf von Execute - ziemlich gewagt.
Abgesehen davon, wartest du ja sowieso in der repeat-Schleife auf die Beendigung des Threads. Warum dann überhaupt ein Thread? |
AW: Unterschiede TTimer zwischen Delphi 7 und 2010?
Gib doch testweise dem TSaveTimer eine "Aktiv" Property und setze das Enabled der TTimer auf Enabled.
In der Prozedur
Delphi-Quellcode:
hat zwei Vorteile. Du kannst sehen ob die TTimer aktiv sind und es existiert immer nur ein Thread.
procedure TSavetimer.SaveTimerEvent(sender: TObject);
var tr: TSaveThread; begin if not Aktiv then exit; Aktiv := False; . . . Aktiv := True; end |
AW: Unterschiede TTimer zwischen Delphi 7 und 2010?
Zitat:
Ich bin zugegebnermassen nicht besonders Thread-sicher :), warum ist der Aufruf von execute gewagt (ist aber auch schon ein bisschen off-topic).
Delphi-Quellcode:
TSaveThread = class(TThread)
private ExecGroup: TSavetimer; protected procedure execute; override; function DoSave: boolean; public constructor Create(aItem: TSavetimer); destructor destroy; override; end; procedure TSaveThread.execute; var itdata: PItemidentify; srv: TPrOPCClientReader; n: string; p: integer; m, m1: integer; begin try with ExecGroup do begin if not GetTimeAllow then exit; // Prüfungen ob gespeichert werden soll if not GetTriggerAllow then exit; end; terminate; finally terminate; end; end; |
AW: Unterschiede TTimer zwischen Delphi 7 und 2010?
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:48 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz