Timer ab gespeicherter Zeit weiterlaufen lassen

  • VB.NET
  • .NET (FX) 4.5–4.8

Es gibt 11 Antworten in diesem Thema. Der letzte Beitrag () ist von Chris_93.

    Timer ab gespeicherter Zeit weiterlaufen lassen

    Hallo zusammen,

    bei folgendem Sachverhalt komm ich momentan nicht weiter:

    Bei Start der Form fängt in einer TextBox ein Timer an zu laufen.

    VB.NET-Quellcode

    1. Private _StartTime As Long
    2. Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    3. Timer1.Start()
    4. _StartTime = DateTime.Now.Ticks
    5. End Sub
    6. Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
    7. Dim span = TimeSpan.FromTicks(Date.Now.Ticks - _StartTime)
    8. TextBox4.Text = String.Format("{0:hh}:{0:mm}:{0:ss}", span)
    9. End Sub


    Beim Event Form_Closing wird die Zeit, die gerade in Textbox angezeigt wird, in der Registry gespeichert.
    Z.B. 01:30:00 (=Registry-Wert)

    Beim nächsten Start der Anwendung wird dieser Wert ausgelesen und wieder in die Textbox eingetragen.

    Soweit alles ok.

    Nach erfolgreicher Eintragung in der Textbox soll der Timer bei der ausgelesenen Zeit weiterlaufen (z.B. 01:30:00) und nicht wieder von vorne bei 00:00:00 beginnen.

    Doch genau das will mir nicht gelingen - meine bisherigen Versuche waren allesamt erfolglos.

    Da ich bei meiner Suche keinen ähnlichen Beitrag finden konnte die Nachfrage.

    Bin für jeden Vorschlag dankbar! :)

    Grüße
    Chris

    Chris_93 schrieb:

    Beim Event Form_Closing wird die Zeit, die gerade in Textbox angezeigt wird, in der Registry gespeichert.
    Wozu brauchst Du einen Timer?
    Du hast einen Startzeitpunkz und Du hast einen End-Zeitpunkt.
    Die Differenz beider ist die Laufzeit.
    Die kannst Du zur nächsten Laufzeit addieren.
    Feddich.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Danke für eure Antworten!

    Die Anwendung liegt im Autostart und wird nach Rechnerstart gestartet.
    Geschlossen werden kann sie nicht einfach so - beim Schließen wird Sie minimiert und ist über einen Klick auf ein NotifyIcon im Infobereich wieder aufrufbar.
    Der Timer läuft "ununterbrochen" immer weiter --> d.h. die Anwendung ist sozusagen ganztägig geöffnet.
    Bei Bedarf wird die Anwendung über den Infobereich aufgerufen und man kann sich u.a. die seit Start vergangene Zeit im Timer ansehen.

    Das Weiterlaufen ab der gespeicherten Zeit ist nur für den Fall, falls der Rechner aus i-einem Grund neu gestartet werden muss.

    In dieser Situation soll nach dem Neustart ab der Zeit weitergemacht werden, die vor Herunterfahren in der Registry gespeichert wurde, da zu bestimmten Zeiten Meldungen erscheinen.
    Beispiel:
    Rechner wurde um 8:00 Uhr gestartet, muss um 10:00 neugestartet werden.
    Nach 3 Stunden (= 11:00 Uhr) Laufzeit ist eine Meldung erforderlich.
    Der Timer fängt in dieser Situation nach dem Neustart wieder bei 00:00:00 an und die bereits gelaufenen zwei Stunden (02:00:00) sind verloren.
    Die Meldung würde zwei Stunden später als eigentlich vorgesehen erscheinen.

    Der Anwender soll die Zeit, die läuft, sehen, deshalb der Timer.

    Hoffe, habe es verständlich erklärt.

    Chris_93 schrieb:

    Nach erfolgreicher Eintragung in der Textbox soll der Timer bei der ausgelesenen Zeit weiterlaufen (z.B. 01:30:00) und nicht wieder von vorne bei 00:00:00 beginnen.


    Naja, dann wirst du, was du bisher als "_StartTime" dir merkst, wohl um 1:30:00 zurückverlegen müssen.

    VB.NET-Quellcode

    1. _StartTime = Date.Now - Timespan.FromMinutes(90)

    RodFromGermany schrieb:

    Wozu brauchst Du einen Timer?

    Chris_93 schrieb:

    Der Anwender soll die Zeit, die läuft, sehen, deshalb der Timer.
    ist ein neue Sachverhalt, der oben nicht drin stand.
    Fang an mit einer vollständigen Problembeschreibung / Aufgabenstellung.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Guten Abend,

    @ ErfinderDesRades
    Ergänze ich den Code um deinen Vorschlag

    VB.NET-Quellcode

    1. ​_StartTime = Date.Now - Timespan.FromMinutes(90)
    wird folgender Fehler noch vor dem Debugging gemeldet:
    "Der Wert vom Typ "Date" kann nicht in "Long" konvertiert werden."

    Liegt daran, dass zu Beginn

    VB.NET-Quellcode

    1. ​Private _StartTime As Long
    _StartTime als Long definiert wird.

    @RodFromGermany
    Vollständige Situations/-Problembeschreibung:
    Die Anwendung wird per Autostart gestartet und erst beim Herunterfahren geschlossen.
    Beim Start (Form_Load) fängt ein Timer ab 00:00:00 an zu laufen - die laufende Zeit wird in einer Textbox angezeigt (der Anwender soll die Zeit sehen können).
    Wird der Rechner neu gestartet, wird die bereits gelaufene Zeit (der Inhalt der Textbox zum Zeitpunkt des Herunterfahrens), z.B. 00:01:30 (= 1 Std 30 Min), in der Registry gespeichert.
    Ist der Rechner wieder hochgefahren, soll die Zeit nicht wieder bei 00:00:00 anfangen zu laufen, sondern beim dem in der Registry gespeicherten Wert, z.B. 00:01:30.
    Das ist erforderlich, da beim Erreichen bestimmter Zeiten Meldungen erscheinen.

    Meine Frage ist, wie der Timer ab der Zeit fortgesetzt werden kann, die in einer TextBox steht, damit sowohl die Meldungen zu den korrekten Zeitpunkten erscheinen als auch der Anwender die Zeit sieht.


    Lade ich den Wert aus der Registry in die Textbox und starte den Timer, fängt er trotzdem bei 00:00:00.
    Führe ich den Code mit folgender Änderung aus

    VB.NET-Quellcode

    1. _StartTime = TextBox4.Text
    , erhalte ich folgenden Fehler:
    System.InvalidCastException: Ungültige Konvertierung von der Zeichenfolge in Typ Long.
    InnerException: Die Eingabezeichenfolge hat das falsche Format.


    Grüße
    Chris
    Schalte mal unbedingt Option Strict On(falls du nicht weisst, was das ist -> Google ist deine Mami).
    Dann solltest du "_StartTime" eben so deklarieren:

    VB.NET-Quellcode

    1. ​Private _StartTime as Date

    Dann musst du halt den Long-Wert in ein Date-Format formatieren. Auch dass du versuchst einen String in eine Zahl zu konvertieren ist nicht gut/richtig. Benutze richtige Konvertierungsmöglichkeiten angefangen bei Integer.Parse , Integer.TryParse , Long.Parse oder sogar Convert.To...
    Ich verstehe auch nicht warum du überhaupt die Daten in der Registry speicherst, benutze doch lieber My.Settings?

    LG
    Zur Programmausführung wird lediglich die .exe benötigt. Die aktuelle steht einfach in einem Explorer-Verzeichnis bereit.
    Wird in diesem Verzeichnis eine "neue" .exe (neuere Version) bereitgestellt, wird die Settingsdatei, die mit der "alten" .exe erzeugt wurde, von der neuen .exe nicht berücksichtigt.
    Zum Beispiel wird die zuletzt mit der alten .exe gespeicherte Position der Form von der neuen .exe nicht geladen.
    Deshalb verwende ich einfach die Registry, da werden die Daten ".exe"-übergreifend berücksichtigt.

    Das mit String in eine Zahl war mir fast klar.
    Das sollte oben nur das Beispiel verdeutlichen.

    Das mit

    VB.NET-Quellcode

    1. Private _StartTime as Date
    habe ich bereits versucht, haut so nicht hin, da dann an zwei anderen Stellen wieder Fehler kommen.

    Ich dreh mich bei dieser Sache im Kreis => werde mir die von dir genannten Konvertierungsmöglichkeiten ansehen.

    Danke für die Tipps!

    Grüße
    Ganz einfache Regel: Für einen Zeitpunkt nimm nicht Long, sondern Date. Für eine Zeitspanne nimm Timespan. Wenn du daraufhin an anderen Stellen Fehler kriegst, dann deshalb, weil du auch dort unangemessene Datentypen verwendest.
    Korrigier das doch einfach, dann wird dein Proggi signifikant besser.
    Kannst die Fehler auch posten, aber vmtl. sind die alle recht trivial.

    Wenn du konsequent immer die angemessenen Datentypen verwendest, dann wirst du auch nur äusserst selten konvertieren müssen.

    Und dem mit den Settings stimme ich zu - Settings sind viel einfacher zu bedienen, sind typisiert (also mal wieder Konvertierungen unnötig), sind weniger fehler-anfällig und manipulieren nicht das System des Anwenders.

    Chris_93 schrieb:

    Meine Frage ist
    Was ist der Unterschied zwischen 12 Uhr und 12 Stunden?
    Wenn Du das verstanden hast, hast Du Dein Problem gelöst. :thumbup:
    Sieh Dir die Operatoren an, die DateTime und TimeSpan bieten.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!