Timer mehrmals verwenden

  • VB.NET

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

    Timer mehrmals verwenden

    Hallo Ihr,

    ich mache schon ne Weile in VB rum aber immer nur so kleckerweise, darum komme ich manchmal an die mir nicht so logisch erscheinenden Grenzen meines Wissens über VB 2010.

    Ich habe meiner Meinung nach was recht simples. Ich habe 12 Labels untereinander. Ich möchte folgendes erreichen.

    Klick auf StartButton:

    -2 Töne erklingen
    -label1 färbt sich rot
    -Zeit zählt 30 Sekunden runter und stellt dies in einem LabelX dar.
    -nach 30 Sekunden ein weiterer Ton erklingt und Label 1 färbt sich grün
    -nach 90 Sekunden Label1 färbt sich gelb
    -nach 30 Sekunden Label2 färbt sich blau

    jetzt soll er gleiche Prozedur mit Label2 machen

    Nachdem Label2 -blau- ist soll mit einem Klick auf Button "weiter" selbe Prozedur erneut gestartet werden aber diesmal mit Label3 und Label4.
    Danach mit Label5 udn Label6 usw. und so fort.

    Die Prozedur an sich habe ich ohne Probleme hin bekommen. Nur möchte ich nicht für jedes zweierpacket Labels eine neuen Timer einfügen.
    Ich muss dem Timer1_Tick ja sagen was er tun soll wenn er auf 0 steht ergo die 30 sek. abgelaufen sind. Wenn Ich Ihm hier sage gehe zu Label3 dann würde er jedesmal wieder dahin gehen.

    Ich hoffe Ihr versteht was ich meine. Ich hätte im Grunde gerne dass der Timer1_Tick im Private Sub selber ausgeführt wird. Aber das geht scheinbar nicht, bzw. entzieht sich das meiner Kenntniss. Wahrscheinlich gibts ne recht simple Lösung dafür.

    Hier noch der Code .Ich habe 2 Timer 1x 30 Sekunden und 1x 90 Sekunden

    VB.NET-Quellcode

    1. Private Sub Starte_Fita_Frei_D1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Starte_Fita_Frei_D1.Click
    2. vorlauf_start()
    3. End Sub
    4. Private Sub vorlauf_start()
    5. My.Computer.Audio.Play(Application.StartupPath & "\Horn.wav", AudioPlayMode.WaitToComplete)
    6. My.Computer.Audio.Play(Application.StartupPath & "\Horn.wav", AudioPlayMode.WaitToComplete)
    7. If AB1.BackColor = Color.Transparent Then
    8. AB1.BackColor = Color.Red
    9. End If
    10. Timer1.Start()
    11. End Sub
    12. Private Sub vorlauf_ende()
    13. My.Computer.Audio.Play(Application.StartupPath & "\Horn.wav", AudioPlayMode.WaitToComplete)
    14. If AB1.BackColor = Color.Red Then
    15. AB1.BackColor = Color.Green
    16. Timer2.Start()
    17. End If
    18. If AB1.BackColor = Color.Blue Then
    19. 'vorlauf_start()
    20. End If
    21. Timer2.Start()
    22. End Sub
    23. Public Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
    24. Vorlaufzeit -= 1
    25. Label11.Text = CStr(Vorlaufzeit)
    26. If Vorlaufzeit = 0 Then
    27. Timer1.Stop()
    28. vorlauf_ende()
    29. End If
    30. End Sub
    31. Private Sub Timer2_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer2.Tick
    32. Schieszeit -= 1
    33. Label11.Text = CStr(Schieszeit)
    34. If Schieszeit = 30 Then
    35. AB1.BackColor = Color.Yellow
    36. End If
    37. If Schieszeit = 0 Then
    38. Timer2.Stop()
    39. AB1.BackColor = Color.Blue
    40. End If
    41. End Sub
    Mal als Anregung zu verstehen. Nicht schön, aber die Idee wird klar und das anpassen ist trivial.

    VB.NET-Quellcode

    1. Public Class Form1
    2. Private WithEvents tm As New Timer With {.Interval = 1000, .Enabled = False}
    3. Private ActionTicker As Integer = 0
    4. Private LabelPair As Tuple(Of Label, Label)
    5. Private LabelCounter As Integer = 0
    6. Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
    7. If tm.Enabled Then Exit Sub
    8. Select Case LabelCounter
    9. Case 0
    10. LabelCounter += 1
    11. LabelPair = New Tuple(Of Label, Label)(Label1, Label2)
    12. Label3.Text = "30"
    13. ActionTicker = 1
    14. tm.Enabled = True
    15. End Select
    16. End Sub
    17. Private Sub tm_Tick(sender As Object, e As System.EventArgs) Handles tm.Tick
    18. Debug.Print(ActionTicker.ToString)
    19. If ActionTicker < 31 Then Label3.Text = (30 - ActionTicker).ToString
    20. If ActionTicker = 30 Then LabelPair.Item1.BackColor = Color.Green
    21. If ActionTicker = 120 Then LabelPair.Item1.BackColor = Color.Yellow
    22. If ActionTicker = 150 Then
    23. LabelPair.Item2.BackColor = Color.Blue
    24. tm.Enabled = False
    25. End If
    26. ActionTicker += 1
    27. End Sub
    28. End Class
    Danke für die Antwort. ist auf jeden Fall mal Hilfreich zu sehen wie man das einbindet. Hatte erst Problemchen, weil ich dachte er hört auf mit Zählen, aber er zählt im Hintergrund weiter ohne es im Label zu zeigen dass er noch Zählt. Das benötige ich auf jeden Fall. Aber Danke für die Hilfe.

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

    Wenn Du weißt, zu welchen Zeitpunkten Du einen Timer-Tick benötigst, kannst Du Dir auch ein dynamisches Verhalten implementieren.
    In einem Array legst Du die erforderlichen Zeitdifferenzen zum letzten Tick ab, und dann musst Du nur noch den Index hochzählen:
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Private TickTick() As Integer = {30, 30, 60, 30 }
    2. Private TickIndex As Integer = 0
    3. Sub Form_Load()
    4. Timer1.Enabled = True
    5. Timer.Interval = TickTick(TickIndex)
    6. End Sub
    7. Sub Timer1_Tick()
    8. Select Case TickIndex
    9. Case 0: ' Tue dies und jenes
    10. Case 1: ' Tue dies und jenes
    11. Case 2: ' Tue dies und jenes
    12. Case 3: ' Tue dies und jenes
    13. Case Else
    14. Timer1.Enabled = False
    15. Return
    16. End Select
    17. ' nächstes Element
    18. TickIndex += 1
    19. Timer.Interval = TickTick(TickIndex)
    20. End Sub
    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!
    Hallo Ihr. Jetzt schreibe ich hier nochmal rein, weil ich gerade wiedermal auf dem Schlauch stehe.
    Ich bin recht weit gekommen und habe noch nenn paar Dinge angepasst. Jetzt taucht allerdings ein Problem auf welches ich mir nicht erklären kann. Ich habe einen Button der wie gesagt den Timer und die Töne in bestimmten Sekunden abspielt und die Farbe der Labels ändert.

    Wenn der Durchlauf fertig ist (funktioniert soweit ganz gut) kann ich allerdings den 2. Button der die nächsten Labels mit gleicher Prozedur behandeln soll nicht starten. Ich kann zwar klicken, aber es passiert rein garnix. Der hängt am Ende immer beim END SUB des Timers fest. Mit EXIT SUB hatte ich keinen Erfolg. Woran kann das liegen?

    Hier der Code.

    VB.NET-Quellcode

    1. Public Class Form1
    2. Private wnd As Form2
    3. 'Private Vorlaufzeit As Integer = 5
    4. 'Private Schieszeit As Integer = 5
    5. Private sGesamtzeit As Integer = 15
    6. Private WithEvents tm As New Timer With {.Interval = 100, .Enabled = False}
    7. Private ActionTicker As Integer = 0
    8. Private LabelPair As Tuple(Of Label, Label, Button)
    9. Private LabelCounter As Integer = 0
    10. Public Sub New()
    11. InitializeComponent()
    12. End Sub
    13. Private Sub Starte_Fita_Frei_D1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Starte_Fita_Frei.Click
    14. If tm.Enabled Then Exit Sub
    15. Select Case LabelCounter
    16. Case 0
    17. LabelCounter += 1
    18. LabelPair = New Tuple(Of Label, Label, Button)(AB1, CD2, Starte_Fita_Frei)
    19. ActionTicker = 1
    20. tm.Enabled = True
    21. End Select
    22. End Sub
    23. Private Sub tm_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles tm.Tick
    24. tm_sound.Start()
    25. Debug.Print(ActionTicker.ToString)
    26. LabelPair.Item1.BackColor = Color.Red
    27. Status2.Text = "Vorlaufzeit Schusslinie"
    28. LabelPair.Item3.Text = "noch " & (150 - ActionTicker) & " Sekunden"
    29. If ActionTicker = 1 Then My.Computer.Audio.Play(Application.StartupPath & "\Horn.wav", AudioPlayMode.WaitToComplete)
    30. If ActionTicker = 2 Then My.Computer.Audio.Play(Application.StartupPath & "\Horn.wav", AudioPlayMode.WaitToComplete)
    31. If ActionTicker = 30 Then My.Computer.Audio.Play(Application.StartupPath & "\Horn.wav", AudioPlayMode.WaitToComplete)
    32. If ActionTicker > 30 Then LabelPair.Item1.BackColor = Color.Green 'vergangene Zeit
    33. If ActionTicker > 30 Then Status2.Text = "Schießzeit"
    34. If ActionTicker > 120 Then LabelPair.Item1.BackColor = Color.Yellow
    35. If ActionTicker > 120 Then Status2.Text = "noch 30 Sek. Schießzeit"
    36. If ActionTicker > 150 Then
    37. LabelPair.Item1.BackColor = Color.Blue
    38. Status2.Text = "nächste Gruppe"
    39. End If
    40. 'LabelPair.Item1.BackColor = Color.Blue
    41. 'tm_sound.Start()
    42. If ActionTicker = 150 Then LabelPair.Item3.Text = "noch " & (150 - ActionTicker) & " Sekunden"
    43. If ActionTicker = 150 Then My.Computer.Audio.Play(Application.StartupPath & "\Horn.wav", AudioPlayMode.WaitToComplete)
    44. If ActionTicker = 151 Then My.Computer.Audio.Play(Application.StartupPath & "\Horn.wav", AudioPlayMode.WaitToComplete)
    45. If ActionTicker = 180 Then My.Computer.Audio.Play(Application.StartupPath & "\Horn.wav", AudioPlayMode.WaitToComplete)
    46. If ActionTicker > 150 Then LabelPair.Item2.BackColor = Color.Red
    47. If ActionTicker > 180 Then LabelPair.Item2.BackColor = Color.Green 'vergangene Zeit
    48. If ActionTicker > 180 Then Status2.Text = "Schießzeit"
    49. If ActionTicker > 270 Then LabelPair.Item2.BackColor = Color.Yellow
    50. If ActionTicker > 270 Then Status2.Text = "noch 30 Sek. Schießzeit"
    51. If ActionTicker = 300 Then
    52. LabelPair.Item2.BackColor = Color.Blue
    53. tm.Enabled = False
    54. My.Computer.Audio.Play(Application.StartupPath & "\Horn.wav", AudioPlayMode.WaitToComplete)
    55. My.Computer.Audio.Play(Application.StartupPath & "\Horn.wav", AudioPlayMode.WaitToComplete)
    56. My.Computer.Audio.Play(Application.StartupPath & "\Horn.wav", AudioPlayMode.WaitToComplete)
    57. End If
    58. ActionTicker += 1
    59. End Sub
    60. Private Sub Start_Passe_2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Start_Passe_2.Click
    61. If tm.Enabled Then Exit Sub
    62. If CD2.BackColor = Color.Blue Then
    63. Select Case LabelCounter
    64. Case 0
    65. LabelCounter += 1
    66. LabelPair = New Tuple(Of Label, Label, Button)(CD3, AB4, Start_Passe_2)
    67. ActionTicker = 1
    68. tm.Enabled = True
    69. End Select
    70. If LabelPair.Item2.BackColor = Color.Blue Then
    71. tm.Enabled = False
    72. End If
    73. Else : Status2.Text = "vorherige Passe nicht beendet"
    74. End If
    75. End Sub
    76. End Class

    Kay Petri schrieb:

    VB.NET-Quellcode

    1. If tm.Enabled Then Exit Sub

    Ich denke, es liegt da dran.
    Setz auf diese Zeile einen Haltepunkt und steppe die Routine durch.
    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!
    Nein. Ich habe den Haltepunkt in Zeile 58 gemacht. Ab dort debugge ich manuell. Er geht weiter bis Zeile 65. Geht nicht weiter oder so. Ich kann dann auf den 2. Button drücken udn nix passiert.

    Wenn ich das Programm starte und dann erst den Button 2 klicke, dann geht dieser problemlos. Klicke ich nach dem Ende auf Button1 kommt dort auch kein Reaktion.

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

    Fein, dass Du Deinen Fehler gefunden hast.

    Kay Petri schrieb:

    Nein. Ich habe den Haltepunkt in Zeile 58 gemacht. Ab dort debugge ich manuell. Er geht weiter bis Zeile 65. Geht nicht weiter oder so.

    Beim nächsten Mal so, dass man es auch verstehen kann. :D
    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!