AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein Unterschiede TTimer zwischen Delphi 7 und 2010?

Unterschiede TTimer zwischen Delphi 7 und 2010?

Ein Thema von JohannesK · begonnen am 7. Jul 2015 · letzter Beitrag vom 7. Jul 2015
Antwort Antwort
Seite 1 von 2  1 2   
JohannesK

Registriert seit: 17. Jul 2003
Ort: Abtwil
118 Beiträge
 
Delphi 2010 Professional
 
#1

Unterschiede TTimer zwischen Delphi 7 und 2010?

  Alt 7. Jul 2015, 15:35
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:
  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;
Die Timer sind den Gruppen über einen entsprechenden Pointer zugeordnet. D7 läuft seit Jahren problemos, D2010 löst keine Timer aus.

Hat irgendjemand einen Tipp?
mit freundlichem Gruss

So einfach wie möglich. Aber nicht einfacher.
  Mit Zitat antworten Zitat
Photoner

Registriert seit: 6. Dez 2012
Ort: Nürnberg
103 Beiträge
 
Delphi 10.1 Berlin Starter
 
#2

AW: Unterschiede TTimer zwischen Delphi 7 und 2010?

  Alt 7. Jul 2015, 15:39
Da fehlt noch was.

..Timer.Enabled := False; Wo werden die Timer aktiviert? Was für ein Intervall? Wird mehrfach dein Savethread erzeugt obwohl du ihn nur einmal brauchst?

Mehr Fragen als Antworten
Chris
  Mit Zitat antworten Zitat
Morphie

Registriert seit: 27. Apr 2008
Ort: Rahden
630 Beiträge
 
#3

AW: Unterschiede TTimer zwischen Delphi 7 und 2010?

  Alt 7. Jul 2015, 15:40
Wo werden die Timer denn eingeschaltet? (Enabled := true)

edit: zu spät
  Mit Zitat antworten Zitat
JohannesK

Registriert seit: 17. Jul 2003
Ort: Abtwil
118 Beiträge
 
Delphi 2010 Professional
 
#4

AW: Unterschiede TTimer zwischen Delphi 7 und 2010?

  Alt 7. Jul 2015, 15:47
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;
mit freundlichem Gruss

So einfach wie möglich. Aber nicht einfacher.

Geändert von JohannesK ( 7. Jul 2015 um 15:52 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von baumina
baumina

Registriert seit: 5. Mai 2008
Ort: Oberschwaben
1.275 Beiträge
 
Delphi 10.2 Tokyo Enterprise
 
#5

AW: Unterschiede TTimer zwischen Delphi 7 und 2010?

  Alt 7. Jul 2015, 15:59
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.
Hinter dir gehts abwärts und vor dir steil bergauf ! (Wolfgang Ambros)
  Mit Zitat antworten Zitat
JohannesK

Registriert seit: 17. Jul 2003
Ort: Abtwil
118 Beiträge
 
Delphi 2010 Professional
 
#6

AW: Unterschiede TTimer zwischen Delphi 7 und 2010?

  Alt 7. Jul 2015, 16:06
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
mit freundlichem Gruss

So einfach wie möglich. Aber nicht einfacher.

Geändert von JohannesK ( 7. Jul 2015 um 16:09 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
8.433 Beiträge
 
Delphi 10.4 Sydney
 
#7

AW: Unterschiede TTimer zwischen Delphi 7 und 2010?

  Alt 7. Jul 2015, 16:07
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?
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Photoner

Registriert seit: 6. Dez 2012
Ort: Nürnberg
103 Beiträge
 
Delphi 10.1 Berlin Starter
 
#8

AW: Unterschiede TTimer zwischen Delphi 7 und 2010?

  Alt 7. Jul 2015, 16:12
Gib doch testweise dem TSaveTimer eine "Aktiv" Property und setze das Enabled der TTimer auf Enabled.

In der Prozedur

Delphi-Quellcode:
procedure TSavetimer.SaveTimerEvent(sender: TObject);
var tr: TSaveThread;
begin
if not Aktiv then exit;

Aktiv := False;
.
.
.
Aktiv := True;
end
hat zwei Vorteile. Du kannst sehen ob die TTimer aktiv sind und es existiert immer nur ein Thread.
Chris
  Mit Zitat antworten Zitat
JohannesK

Registriert seit: 17. Jul 2003
Ort: Abtwil
118 Beiträge
 
Delphi 2010 Professional
 
#9

AW: Unterschiede TTimer zwischen Delphi 7 und 2010?

  Alt 7. Jul 2015, 16:20
Zitat:
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?
Der Thread deshalb, damit sich verschiedene Gruppen beim Abspeichern nicht über die Timeraufrufe in die Quere kommen.
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;
mit freundlichem Gruss

So einfach wie möglich. Aber nicht einfacher.

Geändert von JohannesK ( 7. Jul 2015 um 16:25 Uhr)
  Mit Zitat antworten Zitat
JohannesK

Registriert seit: 17. Jul 2003
Ort: Abtwil
118 Beiträge
 
Delphi 2010 Professional
 
#10

AW: Unterschiede TTimer zwischen Delphi 7 und 2010?

  Alt 7. Jul 2015, 16:23
Gib doch testweise dem TSaveTimer eine "Aktiv" Property und setze das Enabled der TTimer auf Enabled.

hat zwei Vorteile. Du kannst sehen ob die TTimer aktiv sind und es existiert immer nur ein Thread.
Die Timer sind nach Ende der Definitionsfunktionen aktiv, das habe ich mit einer entsprechenden Rückmeldung überprüft, ich sehe drum in einer zusätzlichen Variablen keinen Vorteil. Ausserdem läuft das exakt gleiche Programm in D7
mit freundlichem Gruss

So einfach wie möglich. Aber nicht einfacher.
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +2. Es ist jetzt 13:31 Uhr.
Powered by vBulletin® Copyright ©2000 - 2021, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2021 by Daniel R. Wolf