ein Ereignis zu einer bestimmten Uhrzeit auslösen



  • weisst Du noch wie Du das mit dem Thread gemacht hast?



  • Hallo,

    so, wie du es jetzt implementiert hast müsste die Aufgabe gleich 60 mal ausgeführt werden, weil du den Timer ja einmal pro Sekunde aufrufst, aber nur die Minuten vergleichst.

    Wenn die Aufgabe länger als 1 Sekunde geht, dann kann es auch noch zu überschneidungen kommen, der Timer wird währenddessen noch mal aufgerufen.

    mein Vorschlag (nicht kompilierbar):

    void __fastcall TF_HO::Timer1(TObject *Sender)
    {
       Timer1->Enabled = false;
       AnsiString aktZeit   = TDateTime(Now()).FormatString("hh.nn");
       AnsiString startZeit = E_StartStunde->Text + "." + E_StartMinute->Text;
       if (aktZeit == startZeit) {
           //hier der auszuführende Code;
          Sleep(1 minute);
       }
       Timer1->Enabled = true;
    }
    

    Aber damit bremst du die dann wahrscheinlich die Anwendung aus, im Sleep
    -> Thread
    im Thread kannst du einfach die Execute Methode benutzen:

    while (!Terminated) {
       AnsiString aktZeit   = TDateTime(Now()).FormatString("hh.nn");
       AnsiString startZeit = E_StartStunde->Text + "." + E_StartMinute->Text;
       if (aktZeit == startZeit) {
           //hier der auszuführende Code;
          Sleep(10 minuten);  // wenn das nur einmal pro tag gemacht werden soll 
                              //kann man da auch noch höher stellen
       } else {
         Sleep(10Sekunden);
       }
    }
    


  • Keine schlaue Idee, in einem Timer Sleep aufzurufen, denn damit blockierst du die Message Queue des Fensters. Ein Sleep() von einer Minute versetzt deine komplette Anwendung für 1 Minute in Tiefschlaf.
    Eine Überprüfung auf Gleichheit von zwei Zeitstempeln halte ich ebenfalls nicht für schlau, besser man prüft auf größergleich.
    Den Zeitpunkt als String zu verwalten halte ich auch nicht für schlau, ein Zeitpunkt ist keine Zeichenkette. Ein Unix Zeitstempel oder ein TDateTime Objekt sind da besser geeignet, wobei der Unix Zeitstempel für zukünftige Ereignisse schwerer zu erzeugen ist als ein TDateTime Objekt.



  • Hallo,

    wieso denn nicht einfach das Interval des TImers auf 1 Minute (=60000) stellen 😕

    LG



  • Kommt drauf an, wie zeitgenau das Ereignis ausgelöst werden soll. Mit einem Timer von einer Minute hat man schlimmstenfalls bis zu einer Minute Verzögerung.



  • rudpower schrieb:

    weisst Du noch wie Du das mit dem Thread gemacht hast?

    So, ich habe das alte Programm mal ausgebuddelt und etwas modifiziert 🙂

    hier (http://www.cshare.de/file/972d2f8cd6fb839e24906ab82a7e4e67/Zeitpr%FCfung+_im_Thread.zip.html) kannst Du Dir das mal anschauen. Ich hoffe Du kannst es nachvollziehen (ist garnicht so komplex).

    Wie ja schon weitere geschrieben haben, würde ein Programm "einfrieren", wenn man es mittels Timer machen würde. Und genau das Problem hatte ich damals 😡

    Schönen Gruß
    Torsten



  • torsten_156 schrieb:

    Wie ja schon weitere geschrieben haben, würde ein Programm "einfrieren", wenn man es mittels Timer machen würde.

    Die App friert nur ein wenn du "sleep" verwendest! Nicht aber bei der Verwendung von TTimer! TTimer erzeugt einen eigenen Thread!

    LG, Micha



  • RandomAccess85 schrieb:

    TTimer erzeugt einen eigenen Thread!

    Hmm, meinst du nicht eher eine Callback? Die TimerProc kann beim Aufruf von SetTimer definiert werden.
    Oder aus welcher Quelle ist diese Aussage?

    mfg
    kpeter



  • kpeter schrieb:

    Hmm, meinst du nicht eher eine Callback? Die TimerProc kann beim Aufruf von SetTimer definiert werden.

    Man kanns ja auch unnötig kompliziert machen! 🙄 👎

    LG



  • RandomAccess85 schrieb:

    kpeter schrieb:

    Hmm, meinst du nicht eher eine Callback? Die TimerProc kann beim Aufruf von SetTimer definiert werden.

    Man kanns ja auch unnötig kompliziert machen! 🙄 👎

    LG

    Zwischen einer Callback-Funktion und einem Thread gibts doch Unterschiede, oder stimmst du mir nicht zu?
    Wäre innerhalb dieses Themas nicht weiter oben der Gedanke geäussert worden, einen Thread für das Auslösen
    eines Ereignisses einzusetzen, hätte ich mir den Kommentar geschenkt. So aber konnte ichs nicht stehen lassen.

    Frohe Ostern 😃



  • RandomAccess85 schrieb:

    TTimer erzeugt einen eigenen Thread!

    TTimer erzeugt keinen eigenen Thread . Das könnt Ihr recht leicht nachvollziehen, indem Ihr mehrere Timer laufen lasst und in einem Timer einen Sleep() einbaut.
    Die anderen Timer werden während der Sleep()-Zeit nichts machen, was bei einem Thread anders wäre - hier würden die Timer auf dem Form weiter laufen egal wie lange die Sleep()-Zeit wäre.

    Gruß myerscola



  • Reicht es nicht, den Interval des Timers auf die Differenz zwischen jetzt und dum Zeitpunkt der Ausführung zu setzen? Da spart man sich etliche Funktionsaufrufe um die Zeit zu vergleichen. Es gibt nur dann Probleme, wenn der Ausführungszeitpunkt weit in der Zukunft liegt und Du die Uhr am Rechner umstellst (oder gerade die Sommerzeit startet oder endet).


Anmelden zum Antworten