Tonausgabe bei jeder vollen Stunde

  • VB.NET

Es gibt 17 Antworten in diesem Thema. Der letzte Beitrag () ist von ErfinderDesRades.

    Tonausgabe bei jeder vollen Stunde

    Hallo,

    ich benutze zur Zeit folgenden Code,wie könnte man ihn verkürzen/verbessern?

    Private Sub Timer2_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer2.Tick

    Dim Alarmzeit As String
    Alarmzeit = Now.ToString("HH:mm:ss") 'Timeofday

    If Alarmzeit = "00:00:00" Then
    My.Computer.Audio.Play(My.Resources.spook, AudioPlayMode.Background)
    ElseIf Alarmzeit = "01:00:00" Then
    My.Computer.Audio.Play(My.Resources.Smssms, AudioPlayMode.Background)
    ElseIf Alarmzeit = "02:00:00" Then
    My.Computer.Audio.Play(My.Resources.Smssms, AudioPlayMode.Background)
    ElseIf Alarmzeit = "03:00:00" Then
    My.Computer.Audio.Play(My.Resources.Smssms, AudioPlayMode.Background)
    ElseIf Alarmzeit = "04:00:00" Then
    My.Computer.Audio.Play(My.Resources.Smssms, AudioPlayMode.Background)
    ElseIf Alarmzeit = "05:00:00" Then
    My.Computer.Audio.Play(My.Resources.Smssms, AudioPlayMode.Background)
    ElseIf Alarmzeit = "06:00:00" Then
    My.Computer.Audio.Play(My.Resources.Smssms, AudioPlayMode.Background)
    ElseIf Alarmzeit = "07:00:00" Then
    My.Computer.Audio.Play(My.Resources.Smssms, AudioPlayMode.Background)
    ElseIf Alarmzeit = "08:00:00" Then
    My.Computer.Audio.Play(My.Resources.Smssms, AudioPlayMode.Background)
    ElseIf Alarmzeit = "09:00:00" Then
    My.Computer.Audio.Play(My.Resources.Smssms, AudioPlayMode.Background)
    ElseIf Alarmzeit = "10:00:00" Then
    My.Computer.Audio.Play(My.Resources.Smssms, AudioPlayMode.Background)
    ElseIf Alarmzeit = "11:00:00" Then
    My.Computer.Audio.Play(My.Resources.Smssms, AudioPlayMode.Background)
    ElseIf Alarmzeit = "12:00:00" Then
    My.Computer.Audio.Play(My.Resources.Smssms, AudioPlayMode.Background)
    ElseIf Alarmzeit = "13:00:00" Then
    My.Computer.Audio.Play(My.Resources.Smssms, AudioPlayMode.Background)
    ElseIf Alarmzeit = "14:00:00" Then
    My.Computer.Audio.Play(My.Resources.Smssms, AudioPlayMode.Background)
    ElseIf Alarmzeit = "15:00:00" Then
    My.Computer.Audio.Play(My.Resources.Smssms, AudioPlayMode.Background)
    ElseIf Alarmzeit = "16:00:00" Then
    My.Computer.Audio.Play(My.Resources.Smssms, AudioPlayMode.Background)
    ElseIf Alarmzeit = "17:00:00" Then
    My.Computer.Audio.Play(My.Resources.Smssms, AudioPlayMode.Background)
    ElseIf Alarmzeit = "18:00:00" Then
    My.Computer.Audio.Play(My.Resources.Smssms, AudioPlayMode.Background)
    ElseIf Alarmzeit = "19:00:00" Then
    My.Computer.Audio.Play(My.Resources.Smssms, AudioPlayMode.Background)
    ElseIf Alarmzeit = "20:00:00" Then
    My.Computer.Audio.Play(My.Resources.Smssms, AudioPlayMode.Background)
    ElseIf Alarmzeit = "21:00:00" Then
    My.Computer.Audio.Play(My.Resources.Smssms, AudioPlayMode.Background)
    ElseIf Alarmzeit = "22:00:00" Then
    My.Computer.Audio.Play(My.Resources.Smssms, AudioPlayMode.Background)
    ElseIf Alarmzeit = "23:00:00" Then
    My.Computer.Audio.Play(My.Resources.Smssms, AudioPlayMode.Background)
    End If


    End Sub
    Hallo,

    Das kann man so deutlich kürzer machen:

    VB.NET-Quellcode

    1. Public Class Form1
    2. Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    3. Timer1.Interval = 60000 ' 1 Tick pro Minute reicht vollkommen aus
    4. Timer1.Start()
    5. End Sub
    6. Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
    7. Dim d As DateTime = Date.Now
    8. If d.Minute = 0 Then
    9. If d.Hour = 0 Then
    10. My.Computer.Audio.Play(My.Resources.spook, AudioPlayMode.Background)
    11. Else
    12. My.Computer.Audio.Play(My.Resources.Smssms, AudioPlayMode.Background)
    13. End If
    14. End If
    15. End Sub
    16. End Class


    Edit:@ghostspace:: Code ging nicht, hab in korrigiert

    mfG

    Derfuhr

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „Derfuhr“ ()

    Derfuhr schrieb:

    1 Tick pro Minute reicht vollkommen aus
    1) Wird dann halt relativ ungenau.
    Wenn es ausreicht, irgendwann in der ersten Minute der vollen Stunde den Chime zu bekommen ist das OK.
    2) Rein theoretisch kann da auch mal ein Chime ausfallen, weil der Timer nicht zwingend tick-genau zuschlägt.

    Wenn schon, dann würde ich den Timer variabel gestalten. Je näher man sich der vollen Stunde nähert, desto hochfrequenter die Abfrage.
    Allerdings würde ich für so ein Programm gar keinen permanenten Prozess starten, sondern den Windows-Scheduler für mich arbeiten lassen.
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --
    Für Genau-Freaks:
    Für eine Uhr habe ich mal einen selbst-kalibrierenden Timer gebastelt.
    Der hat bei Tick immer nachgeguckt, um wieviel er daneben lag, und dann sein eigenes Intervall nachreguliert.

    Das ist auch nicht Atom-Uhr genau, sondern erfordert sogar eine kleine Toleranz, weiler ansonsten nur am nachregeln ist.
    Aber wennich angegeben habe, alle Sekunde zu ticken, kommts auch bei unendlicher Laufzeit nicht zu einem "skipping the beat".

    ErfinderDesRades schrieb:

    Das ist auch nicht Atom-Uhr genau,
    Man kann natürlich die Atomuhr abfragen und damit den Timer kalibrieren, wenn sich das System nicht schon die Atomzeit holt.
    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!
    @
    ErfinderDesRades

    Ist dein Timer hier irgendwo zu finden ?


    @ DerFuhr

    Leider ist es jetzt sehr ungenau, wie es bereits (petaod) erwähnte.

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „ghostspace“ ()

    ghostspace schrieb:

    Leider ist es jetzt sehr ungenau, wie es bereits (petaod) erwähnte.


    Hi,

    da hast du natürlich Recht, hier eine Präzisere Variante:

    VB.NET-Quellcode

    1. Public Class Form1
    2. Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    3. Timer1.Interval = 60000
    4. Timer1.Start()
    5. End Sub
    6. Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
    7. Dim d As DateTime = Date.Now
    8. Select Case d.Minute
    9. Case 0
    10. If d.Hour = 0 Then
    11. My.Computer.Audio.Play(My.Resources.spook, AudioPlayMode.Background)
    12. Else
    13. My.Computer.Audio.Play(My.Resources.Smssms, AudioPlayMode.Background)
    14. End If
    15. Case 58, 59
    16. Timer1.Interval = 500
    17. Case Else
    18. Timer1.Interval = 60000
    19. End Select
    20. End Sub
    21. End Class


    mfG

    Derfuhr
    Ich habe den Code mit einer MessageBox getestet, die kam püntelich. Es kann sein das das Programm einige Zeit benötigt um die WAV zu laden. Wie Groß/lang ist die/das Datei/Lied denn? Der Code ändert den Timer Interval in den Minuten 58 bzw. 59 sind auf 2 Tick´s pro sekunde nach dem Chime Tick er wieder 1 mal pro Minute. Falls du beim testen die zeit auf 59 Minuten gestellt hast kann es sein das der Timer erst in max. 60sec wieder Tickt und wenn der Tick dann erst in Minute 0 kommt ist die Intervaländerung natürlich für die Katz. Test es mal indem du die systemzeit auf 58 minuten stellst und ändere den Code mal temporär so ab:

    VB.NET-Quellcode

    1. If d.Hour = 0 Then
    2. MessageBox.Show("Es ist soweit")
    3. My.Computer.Audio.Play(My.Resources.spook, AudioPlayMode.Background)
    4. Else
    5. MessageBox.Show("Es ist soweit")
    6. My.Computer.Audio.Play(My.Resources.Smssms, AudioPlayMode.Background)
    7. End If


    Ich wette zumindest die MessageBox kommt dann Punktlich.

    mfG

    Derfuhr
    Die Sounddateien sind 80 und 920kb groß
    Auch wenn der Code jetzt abgeändert wurde erscheint keine Messagebox,
    und der Sound wird ca. 1,30min zu früh
    und nochmal ca. 30 sek früher
    und 20 sec später abgespielt :cursing:

    Edit:
    Der Sound ertönt jetzt weiterhin ca. jede minute
    Dann hst du das nicht so gemacht wie ich meinte. Sah deine Timer.Tick routine so aus?

    VB.NET-Quellcode

    1. Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
    2. Dim d As DateTime = Date.Now
    3. Select Case d.Minute
    4. Case 0
    5. If d.Hour = 0 Then
    6. MessageBox.Show("Es ist soweit")
    7. My.Computer.Audio.Play(My.Resources.spook, AudioPlayMode.Background)
    8. Else
    9. MessageBox.Show("Es ist soweit")
    10. My.Computer.Audio.Play(My.Resources.Smssms, AudioPlayMode.Background)
    11. End If
    12. Case 58, 59
    13. Timer1.Interval = 500
    14. Case Else
    15. Timer1.Interval = 60000
    16. End Select
    17. End Sub


    um weitere missverständnisse zu vermeiden hier mein Projektmappe, ist getestet undes geht X(
    starte das debuggen und stell dann deine zeit auf 58 minuten und 30sekunden und warte ab,und du siehst das es geht.

    Oder lass den interval generell so niedrig :cursing: :cursing:
    Gruß

    Derfuhr
    Dateien

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Derfuhr“ ()

    @Derfuhr: Nach der Ausgabe solltest Du den Timer wieder etwas langsamer machen.
    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!

    ghostspace schrieb:

    Ist dein Timer hier irgendwo zu finden ?
    hab ihn gefunden. Und zwar ist die Logik so knapp, dassichs schließlich unnötig fand, da eine Extra-Klasse von zu machen, und hab die Logik einfach ins Tick-Event eines normalen Timers geschrieben

    VB.NET-Quellcode

    1. Private Const _Interval As Integer = 3000
    2. Private Sub Timer1_Tick(ByVal sender As Object, ByVal e As EventArgs) Handles Timer1.Tick
    3. Const Fullsecond As Integer = 1000
    4. Dim dt = Now
    5. Dim NewInterval = -dt.Millisecond
    6. If NewInterval < -500 Then NewInterval += Fullsecond
    7. NewInterval += _Interval
    8. Debug.WriteLine(String.Concat("Timer1.Tick ", dt.ToString("mm:ss:ffff"), " ", NewInterval))
    9. If Timer1.Interval = NewInterval Then Return
    10. Timer1.Interval = NewInterval
    11. End Sub
    das tickt jetzt alle 3 s, und kalibriert sich auf ganze Sekunden.
    Allerdings korrigiert der Algo nur Abweichungen +- 1s, bei größeren Abweichungen treibter Unfug.