Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Timer_Schleife (https://www.delphipraxis.net/138545-timer_schleife.html)

chicky 12. Aug 2009 11:26


Timer_Schleife
 
Delphi-Quellcode:
  MyTimer := TTimer.Create(nil);
          MyTimer.Enabled := True;
          MyTimer.Interval := 20000;   // alle $$$ Millisekunden (= $$$ Minuten) die Datenbank aktualisieren
          MyTimer.OnTimer := DF;
Delphi-Quellcode:
procedure TMy.DF(Sender: TObject);
        {var} ...
begin

      {TString.Create usw.} ...

Sprung1:      
          WLi.DelimitedText := Werte;                
            with t do      //t : TTable
            begin
                if (check3 = true) and (check2 = false) then   //check2 und check3 sind so zu Beginn definiert
                begin
                   if ((SecondOf(StrToTime(WLi.Strings[1])) mod 60) = 0) then goto Sprung2 else
                   begin
                     delay(4000);
                     goto Sprung1;
                   end;
                end;
Sprung2:      begin
                 ShowMessage(WLi.Strings[1]);                  
                    check2 := true;
                    check3 := false;
                    delay(4000);
                end;
            end;
                end;

      {alles wieder Free usw.} ...

end;
Das Problem hierbei ist, dass er den Timer zu ignorieren scheint. Er soll doch am Anfang gleich den Wert ausgeben und dann nur alle 20 Sekunden mit kleiner Verzögerung (delay(4000)). Aber er führt es ständig aus (ca. alle 3-4 Sekunden). Kann das mal jemand probieren evtl.?

jfheins 12. Aug 2009 11:32

Re: Timer_Schleife
 
Du weißt schon, dass es beim Aufruf von Delay passieren kann, dass der Timer auslöst, und du wieder in die Timerprozedur reinkommst?

Btw.: Du hhast möglicherweise eine Endlosschleife ...

Ach und: goto's machen das Nachvervolgen des Programmablaufs nicht immer einfacher (um nicht zu sgaen: nahezu unmöglich) und sollten daher äußerst selten und wohlüberlagt eingesetzt werden.

Also zur Universalfrage: Was willst du erreichen, wahrscheinlich gibt's bessere Alternativen als den "Code" ;)

chicky 12. Aug 2009 11:53

Re: Timer_Schleife
 
Zitat:

Du weißt schon, dass es beim Aufruf von Delay passieren kann, dass der Timer auslöst, und du wieder in die Timerprozedur reinkommst?
Nein, das wusste ich nicht. Und nun?

Zitat:

Btw.: Du hhast möglicherweise eine Endlosschleife ...
Wie kommst du darauf?

Zitat:

Was willst du erreichen
Ich möchte, dass bei Programmstart etwas in eine DB geschrieben wird und dann alle 20 Sekunden einer neuer Eintrag hinzukommt (z.B.)

mkinzler 12. Aug 2009 11:57

Re: Timer_Schleife
 
Delay() wartet aktiv.
Entwder 2 Timer verwenden oder Intervall entsprechend umswitchen

Sharky 12. Aug 2009 12:00

Re: Timer_Schleife
 
Zitat:

Zitat von chicky
... Ich möchte, dass bei Programmstart etwas in eine DB geschrieben wird und dann alle 20 Sekunden einer neuer Eintrag hinzukommt (z.B.)

Dann schreibe Dir doch eine Procedure welche die Einträge in der DB vornimmt.
Diese rufst Du dann beim Programmstart (on create oder so) auf.
Dann nimmst Du einen Timer mit einem 20 Sekunden intervall und rufst in seiner OnTimer Methode die Procedure zum schreiben in die DB auf.

Fabian Classen 12. Aug 2009 12:10

Umgang mit boolischen Werten
 
Hi
was mir auch noch aufgefallen ist, dass du auch True und False in deiner if-Anweiseung prüfst.
Das macht man nicht! ;) Guck dir mal dieses Tutorial an: Klick
und besonders diese Seite des Tutorials: Klick

chicky 12. Aug 2009 12:31

Re: Timer_Schleife
 
Danke dir Fabian. Ich bin halt noch relativer Anfänger. Aber vielen Dank

Zitat:

..oder Intervall entsprechend umswitchen
Wie meinst du das?

mkinzler 12. Aug 2009 12:42

Re: Timer_Schleife
 
im onTimer Intervall verkürzen

chicky 12. Aug 2009 12:45

Re: Timer_Schleife
 
Das hab ich grad schon gemacht und teste jetzt. Sieht bisher gut aus. Hab das alles nochmal umgemodelt bzw. auseinader genommen und u.a. Fabians RatschlagLink befolgt.

chicky 12. Aug 2009 13:19

Re: Timer_Schleife
 
Delphi-Quellcode:
Sprung1 : {...neuen Wert holen...}

        if ((SecondOf(StrToTime(WLi.Strings[1])) mod 60) = 0) and  
                 ((MinuteOf(StrToTime(WLi.Strings[1])) mod 10) = 0) then  //volle 10 Minuten
               begin
                   {...in DB schreiben...}
               end
         else          //noch keine vollen 10 Min erreicht
               begin
                  delay(5000);  //Zeitverzögerung, um nächsten Messwert zu checken
                  goto Sprung1;
               end;
Funktioniert insofern, als dass z.B. um 14:20:00 ein Eintrag in die DB vorgnommen wird. Aber der gleiche 2mal. Wie kann das kommen?

[edit=mkinzler]Tag korrigiert Mfg, mkinzler[/edit]

mkinzler 12. Aug 2009 13:25

Re: Timer_Schleife
 
Wenn ich (Sprung-)Lables sehe bekomme ich immer Bauchweh :pale:

chicky 12. Aug 2009 13:26

Re: Timer_Schleife
 
Zitat:

Wenn ich (Sprung-)Lables sehe bekomme ich immer Bauchweh
Tut mir leid, :cry: aber ich weiß keine Alternative ?!

Zoot 12. Aug 2009 13:29

Re: Timer_Schleife
 
Zitat:

Zitat von chicky
Zitat:

Wenn ich (Sprung-)Lables sehe bekomme ich immer Bauchweh
Tut mir leid, :cry: aber ich weiß keine Alternative ?!

Mit dem Sprung bastelst du dir doch eine Art Schleife. Warum?
Einfach ein Timer, wenn der ausgelöst wird in DB schreiben und fertig.
Was soll denn dein Sprung nach "Sprung1"?

chicky 12. Aug 2009 13:33

Re: Timer_Schleife
 
Zitat:

Was soll denn dein Sprung nach "Sprung1"?
Wenn die Uhrzeit, die reinkommt keine vollen Zehn minuten hat
z.B. 13:49:57 ->Sprung
13:49:58 ->Sprung
13:49:59 ->Sprung
13:50:00 ->in DB schreiben

Zoot 12. Aug 2009 13:39

Re: Timer_Schleife
 
Zitat:

Zitat von chicky
Wenn die Uhrzeit, die reinkommt keine vollen Zehn minuten hat
z.B. 13:49:57 ->Sprung
13:49:58 ->Sprung
13:49:59 ->Sprung
13:50:00 ->in DB schreiben

Setz den Timer auf 1 Sekunde:

z.B. 13:49:57 ->Tu nichts
13:49:58 ->Tu nichts
13:49:59 ->Tu nichts
13:50:00 ->in DB schreiben
13:50:01 ->Tu nichts
usw.

chicky 12. Aug 2009 13:52

Re: Timer_Schleife
 
Hab nen Timer gesetzt, der die Uhrzeit prüft und wenn volle 10Min erreicht sind, dann schreibt er in Db,allerdings dieselbe Zeile 42mal

DeddyH 12. Aug 2009 13:54

Re: Timer_Schleife
 
Dann machst Du wohl etwas falsch :glaskugel:

jfheins 12. Aug 2009 14:12

Re: Timer_Schleife
 
Also wenns wirklich immer schön die volle Minute sein soll, würde ich das so machen:

Delphi-Quellcode:
// OnTimer
begin
if (MinuteOf(Now) mod 10 = 0) and SecondOf(now) = 0 then // runde 10 Minuten, Bedingung nochmal überprüfen
begin
  // Machwas
  Timer1.Interval := 570*1000; // 9 Minuten und 30 Sekunden
end
else
begin
  Timer1.Interval := 400;
// 0,4 Sekunden, damit sollte sichergestellt sein
// dass es ein Timer-Event gibt, wenn die Sekunden 0 sind.
end;
end;
Aber ist nur so ne Idee :angel:

Zoot 12. Aug 2009 14:29

Re: Timer_Schleife
 
Zitat:

Zitat von jfheins
Also wenns wirklich immer schön die volle Minute sein soll, würde ich das so machen:

Delphi-Quellcode:
// OnTimer
begin
if (MinuteOf(Now) mod 10 = 0) and SecondOf(now) = 0 then // runde 10 Minuten, Bedingung nochmal überprüfen
begin
  // Machwas
  Timer1.Interval := 570*1000; // 9 Minuten und 30 Sekunden
end
else
begin
  Timer1.Interval := 400;
// 0,4 Sekunden, damit sollte sichergestellt sein
// dass es ein Timer-Event gibt, wenn die Sekunden 0 sind.
end;
end;
Aber ist nur so ne Idee :angel:

Hier solltest du aber noch Sorge tragen, dass 3 Timerevents kommen können, während die Sekunde 0 ist.
[Edit: ok ok, das kann bei dir gar nicht passieren]


Alle Zeitangaben in WEZ +1. Es ist jetzt 05:09 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