Timer - verbleibende Zeit anzeigen



  • Hi !

    Leider geht die Suchfkt. nicht und in den FAQs hab ichs nicht gefunden :

    Ich benutze einen Timer um alle 10min einen Befehl auszuführen, jetzt würde ich
    gerne auf der Form anzeigen lassen wie lange es noch bis zum nächsten Aufrufen dauert. Leider scheint der Timer "von Haus aus" dies nicht zu unterstützen...



  • Tja. Was könnte man da nur machen? Wie wärs, wenn du den TimerInterval auf ein intelligentes mass setzt und dann hald die Aktion erst ausführst wenn das Timer Ereignis x mal ausgeführt wurde?

    -junix


  • Mod

    Hallo

    oder du gehst her und definiert eine (private) Variable.
    IN diese Variable schreibst du beim Wechsel des Timers auf Active
    die aktuelle Zeit (oder noch feinere aufgliederung)
    und ueber eine GetFunktion kannst du dann alles moegliche machen

    MfG
    Klaus



  • Dann benötigt er aber 2 Timer. Einen zum ausführen alle 10 Min. und einen um die Restzeit anzuzeigen.
    junix version ist auf jeden fall besser.



  • -=]xXx[=- schrieb:

    Dann benötigt er aber 2 Timer.

    Sehe ich nicht so. Wenn ich Klaus richtig verstanden habe, merkt er sich
    nur in einer Variable die Zeit, zu der der Timer aktiviert wird. Mit einer
    get-Funktion, die dann z.B. die Differenz zwischen aktueller und gemerkter
    Zeit ausrechnet, kann man sich dann die Zeit anzeigen lassen, die seit der
    Aktivierung vergangen ist.
    Oder mit einer anderen get-Funktion (oder über einen Parameter) kann man
    sich die noch verbleibende Zeit anzeigen lassen.

    Gruß,

    Alexander



  • Alexander Kempf schrieb:

    Oder mit einer anderen get-Funktion (oder über einen Parameter) kann man
    sich die noch verbleibende Zeit anzeigen lassen.

    wie soll das denn ohne timer gehen? oder soll die Zeit nur einmal und nicht kontinuierlich abgefragt werden (Statuszeile vs. ShowMessage z.B.)



  • Irgendwo wird eine Variable vom Typ TDateTime und eine get-Funktion deklariert:

    TDateTime TimerActivatedTime;
    double getTime();
    

    Irgendwo wird der selbstverwaltete Timer aktiviert:

    Timer->Enabled = true;
    TimerActivatedTime = Time();
    

    Jetzt kann man eine Funktion aufrufen, die mir die bereits verstrichene Zeit zurückgibt.
    Diese Funktion könnte z.B. so aussehen:

    double MeineSchoeneKlasse::getTime()
    {
      return Time() - TimerActivatedTime;
    }
    

    Oder habe ich jetzt irgendwas grundsätzlich falsch verstanden?

    Gruß,

    Alexander



  • Also ich denke Joe_K will so eine Art Contdown anzeigen. Und dafür ist junix Vorschlag schon der sinnvollste. Man könnte die Ausgabe natürlich auch in Application->OnIdle durchführen. Nur von der Verwendung von 2 Timern würde ich abraten. So weit ich weiß, stehen Timer unter Windwos nur in begrenzter Anzahl zur Verfügung, deswegen sollte man die Anzahl der Timer auf ein Minimum beschränken.

    Aber vielleicht sollte Joe_K auch einfach noch mal was dazu posten...



  • Das funktioniert zwar grundsätzlich, trotzdem ist die von junix vorgeschlagene Variante deutlich eleganter und sicherer.
    Eleganter, weil (für eine kontinuierliche Anzeige) nicht ständig die Systemzeit abgerufen werden muss. Sicherer, weil sich die Systemzeit während des Timerlaufes ja ändern könnte.

    Ihr habt Glück, dass die Suchfunktion deaktiviert ist! 😉 Das Thema wurde mindestens einmal schon sehr ausführlich diskutiert.



  • Joe_M. schrieb:

    Also ich denke Joe_K will so eine Art Contdown anzeigen. Und dafür ist junix Vorschlag schon der sinnvollste.

    Da habe ich wohl was überlesen.

    Gruß,

    Alexander



  • Alexander Kempf schrieb:

    Da habe ich wohl was überlesen.

    Hast Du nicht. 😉 Es geht nicht direkt aus dem Posting hervor, aber ich vermute es...



  • Hallo Jansen!

    Sicherer, weil sich die Systemzeit während des Timerlaufes ja ändern könnte.

    Würde ich aber eher andersrum betrachten: Wenn die Systemzeit geändert wird (weil der Benutzer merkt, dass die gar nicht stimmt), wird trotzdem weiter gezählt.
    Bei junix's Lösung interessiert es der Software nicht die Bohne, wenn die Zeit umgestellt wird. (Und die Zeit stellt man ja nicht einfach so um, wenn dann möchte man dafür auch die entsprechenden Resultate haben...)

    Und wegen des Zugriffes auf die Systemzeit: Nunja - da bin ich mir nicht sicher und ich denke, dass das auch darauf ankommt, ob das nun ein Countdown werden soll, oder einfach irgendwann nur ne Abfrage.
    Was ist denn "aufwändiger" ? Das Abfragen der Systemzeit zu einem Zeitpunkt, oder alle Sekunden das Timer-Ereignis auszulösen und nen int zu erhöhen.
    Also ich glaube doch eher das Zweite...

    tschüss
    Robert



  • rowisoft schrieb:

    Bei junix's Lösung interessiert es der Software nicht die Bohne, wenn die Zeit umgestellt wird.

    Ähh ja, genau das habe ich doch gesagt!? Sicherer halt, mit anderen Worten zuverlässiger.

    Du startest einen Task, der 15 Minuten dauern soll (Pizza im Ofen) und du möchtest jederzeit wissen, wielange es noch dauert, bis die 15 Minuten um sind.
    Was die Systemzeit des Rechners sagt kann (und sollte) dir dabei völlig schnuppe sein. Wenn du nämlich feststellst, dass dein Rechner 5 Minuten vorging, du die Zeit zurückstellst und anschliessend weiterhin mit 15min - (Time() - StartZeit) prüfst, wielange es noch dauert, dann dürfte die Pizza am Ende recht dunkle Farbtöne angenommen haben. 😉
    Oder aber der Erinnerungs-Alarm geht los (weil die 15 Minuten Realzeit um sind und der Timer ausgelöst hat), und das obwohl dir die Anzeige gerade "noch 5 Minuten" signalisiert hat.



  • Aber wir sind uns unterm Strich also alle einig, dass junix Vorschlag der einfachste, eleganteste, sicherste und somit sinnvollste Weg ist? Warum diskutieren wir dann eigentlich noch? 😉



  • Hallo!

    Du startest einen Task, der 15 Minuten dauern soll (Pizza im Ofen) und du möchtest jederzeit wissen, wielange es noch dauert, bis die 15 Minuten um sind.
    

    Achso meinst du 🙂 Ich habe das von dieser Seite aus betrachtet:

    Countdown bis zum neuen Jahr sinds noch XXX Minuten 🙂
    oder
    Bis zu meinem Geburtstag sinds noch XXX Minuten...

    🤡

    tschüss
    Robert



  • rowisoft schrieb:

    Ich habe das von dieser Seite aus betrachtet:

    Bis zu meinem Geburtstag sinds noch XXX Minuten

    Wo ist da der Unterschied? Du stellst plötzlich fest, dass auf dem Rechner der falsche Monat eingestellt ist. Du korrigierst das und auf einmal sagt dein Programm, das eben noch behauptete, es wären noch 25 Tage, dass es plötzlich noch 340 Tage dauern soll.
    Du hast deinen eigenen Geburtstag verpennt, weil du dich auf die Systemzeit des Rechners verlassen hast. 🙂

    Davon abgesehen passt deine Betrachtungsweise bzw. dein Beispiel auch nicht wirklich zur Problemstellung des ursprünglichen Beitrages, oder?



  • Na ja, irgenwie wird hier von verschiedenen Dingen gesprochen, einmal geht es um einen Intervall (Pizza), zum anderen um einen Zeitpunkt (Geburtstag). Ersteres ist wohl defintiv geklärt. Zweiteres ist so dann wohl nicht lösbar. Reicht ja schon sich beim korrigieren des Datums zu verklicken... Der Systemzeit auf dem Rechner darf man so gesehen gar nicht trauen. Da muß man dann schon Zeitserver aus dem Internet bemühen. 🙂


Anmelden zum Antworten