Wenn Uhrzeit oder in einem Zeitraum setze Bit

  • VB.NET

Es gibt 4 Antworten in diesem Thema. Der letzte Beitrag () ist von RodFromGermany.

    Wenn Uhrzeit oder in einem Zeitraum setze Bit

    Hallo,

    anfangs war ich auf der Suche nach einem Code, der uhrzeitgesteuert ein Event auslöst, diesen habe ich bereits gefunden:

    Quellcode

    1. Dim a_timer As New System.Timers.Timer
    2. AddHandler a_timer.Elapsed, AddressOf Alex
    3. Dim diff As New TimeSpan
    4. Dim date1 As Date = Date.Parse("18:22:00")
    5. Dim date2 As Date = Date.Now
    6. diff = date1.Subtract(date2)
    7. a_timer.Interval() = diff.TotalMilliseconds
    8. a_timer.Enabled = True
    9. a_timer.AutoReset = True


    Quelle: tutorials.de/threads/zu-bestim…n-ablaufen-lassen.196174/

    Der Code funktioniert auch wunderbar, aber ich möchte, dass in einem Zeitraum ein Bit aktiv ist, siehe dieses Beispiel:

    08:00-09:30 Uhr --- Bit 1
    09:30-09:45 Uhr --- Bit 2
    09:45-12:00 Uhr --- Bit 3

    Kann mir jemand weiterhelfen?
    @Murdersquad Steht doch alles da.
    Du darfst natürlich keinen Zeitpunkt abfragen, sondern die betreffende Zeitspanne.

    VB.NET-Quellcode

    1. Dim jetzt = DateTime.Now
    2. If Jetzt > Zeit1 AndAlso Jetzt <= Zeit2 Then
    3. ' Bit 1
    4. Else If Jetzt > Zeit2 AndAlso Jetzt <= Zeit3 Then
    5. ' Bit 2
    6. Else If Jetzt > Zeit3 AndAlso Jetzt <= Zeit4 Then
    7. ' Bit 3
    8. End If
    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!
    Hi
    beachte, dass RodFromGermanys Code nicht funktioniert, sofern sich die Intervalle überlappen können.
    Es wäre btw. fortgeschrittener, aber ggf. sinnvoll, eine nach Zeitpunkt sortierte Liste mit den ausstehenden Tasks System.Threading.AutoResetEvent zu verwenden auf dem ein Thread bis zum gewünschten Ausführungszeitpunkt des nächsten Tasks wartet (WaitOne). Sobald sich das nächste auszuführende Elemnent (d.h. das erste) ändert, würdest du dann die Set-Methode des AutoResetEvents aufrufen. Wird WaitOne beendet, würdest du alle Ereignisse ausführen, die in der Vergangenheit lagen bis das nächste Element in der Zukunft liegt und anschließend wieder auf den nächsten Task warten.

    Viele Grüße
    ~blaze~
    Danke, das Beispiel von Rod ist vollkommen ausreichend, habe es mal angepasst, um das Ergebnis zu sehen.
    Die IF-Abfrage war eigentlich auch nicht das Problem, ich kam nur nicht drauf, wie ich Date.Parse nutze, da mir die MSDN nicht weitergeholfen hat.

    Quellcode

    1. Dim jetzt = DateTime.Now
    2. Dim F1anfang = Date.Parse("19:17:00")
    3. Dim F1ende = Date.Parse("19:17:06")
    4. Dim F2anfang = Date.Parse("19:17:06")
    5. Dim F2ende = Date.Parse("19:17:10")
    6. Dim F3anfang = Date.Parse("19:17:10")
    7. Dim F3ende = Date.Parse("19:17:30")
    8. chkF1.Checked = False
    9. chkF2.Checked = False
    10. chkF3.Checked = False
    11. If jetzt >= F1anfang AndAlso jetzt <= F1ende Then
    12. chkF1.Checked = True
    13. ElseIf jetzt >= F2anfang AndAlso jetzt <= F2ende Then
    14. chkF2.Checked = True
    15. ElseIf jetzt >= F3anfang AndAlso jetzt <= F3ende Then
    16. chkF3.Checked = True
    17. End If

    Murdersquad schrieb:

    Dim F1anfang = Date.Parse("19:17:00")
    Mit dem Parsen reiner Uhrzeiten ohne Datum wäre ich vorsichtig, weil der Datumspart in jedem Falle gesetzt wird.
    Sieh Dir mal diesen Konstrukt an:

    VB.NET-Quellcode

    1. Dim jetzt = DateTime.Now
    2. Dim F1anfang = jetzt.Date.AddHours(19).AddMinutes(17)
    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!