[VB 2010] Mehrfach Countdown in einer Form

  • VB.NET

Es gibt 10 Antworten in diesem Thema. Der letzte Beitrag () ist von Cell.

    [VB 2010] Mehrfach Countdown in einer Form

    Guten Tag,
    Ich habe heute mit VB angefangen und wollte zum Anfang einen Countdown machen welcher mir die Restzeit anzeigt bis ein Raid wieder zur Verfügung steht. ( Also ein kleines Hilfstool für ein Online-Spiel).
    Der Countdown funktionierte am Anfang einwandfrei - dann kam ich auf die Idee das ich für alle Raids einen Countdown erstelle. Also 3 Countdowns auf der selben Form.

    Nun zu meinem Problem..
    Ich lege die Zeit für den Countdown fest- sagen wir mal 50 Sekunden. Wenn ich einen einzelnd laufen lasse funktioniert es einwandfrei. Sobald ich aber 2 oder 3 Countdowns gleichzeitig laufen lasse sind bei allen 3 Countdowns die 50 Sekunden in ca. 10 Sekunden fertig runtergezählt. Der Countdown zählt nicht mehr im Sekundentakt und zählt auch mal 2 und mehr Sekunden gleichzeitig herunter.

    Wie bekomme ich es hin das jeder Countdown für sich selbst zählt und die anderen nicht beeinflusst?

    Hier mein aktueller Code (ist sogut wie alles C&P von Countdown Anleitungen - bevor die Frage aufkommt.. ich habe mich mit dem Code beschäftigt und weiß wofür was da ist bei den meisten Zeilen):
    Spoiler anzeigen

    Visual Basic-Quellcode

    1. Public Class Form1
    2. Dim totaltime As Long
    3. Function AddZero(ByVal par As Integer) As String
    4. Dim a = ""
    5. If par < 10 Then
    6. a = "0" & par
    7. Else
    8. a = par
    9. End If
    10. Return a
    11. End Function
    12. Private Sub set_button_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles set_button.Click
    13. totaltime = hr_input.Value * 60 * 60 + mn_input.Value * 60 + se_input.Value
    14. If totaltime <> 0 Then
    15. main_button.Enabled = True
    16. hr_label.Text = AddZero(totaltime \ 3600)
    17. mn_label.Text = AddZero((totaltime Mod 3600) \ 60)
    18. se_label.Text = AddZero((totaltime Mod 3600) Mod 60)
    19. main_button.Text = "Start"
    20. set_button.Enabled = False
    21. Else
    22. MsgBox("Felder dürfen nicht leer sein!")
    23. End If
    24. End Sub
    25. Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    26. main_button.Enabled = False
    27. main_button1.Enabled = False
    28. main_button2.Enabled = False
    29. End Sub
    30. Private Sub main_button_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles main_button.Click
    31. If main_button.Text = "Start" Or main_button.Text = "Continue" Then
    32. hr_input.Enabled = False
    33. mn_input.Enabled = False
    34. se_input.Enabled = False
    35. count.Enabled = True
    36. main_button.Text = "Stop"
    37. Else
    38. main_button.Text = "Continue"
    39. hr_input.Enabled = True
    40. mn_input.Enabled = True
    41. se_input.Enabled = True
    42. count.Enabled = False
    43. set_button.Enabled = True
    44. End If
    45. End Sub
    46. Private Sub count_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles count.Tick
    47. If totaltime > 0 Then
    48. totaltime -= 1
    49. Else
    50. count.Enabled = False
    51. MsgBox("Es ist Zeit für AW: Weißstein-Tempel!")
    52. main_button.Text = "Start"
    53. hr_input.Enabled = True
    54. mn_input.Enabled = True
    55. se_input.Enabled = True
    56. count.Enabled = False
    57. set_button.Enabled = True
    58. End If
    59. hr_label.Text = AddZero(totaltime \ 3600)
    60. mn_label.Text = AddZero((totaltime Mod 3600) \ 60)
    61. se_label.Text = AddZero((totaltime Mod 3600) Mod 60)
    62. End Sub
    63. Private Sub set_button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles set_button1.Click
    64. totaltime = hr_input1.Value * 60 * 60 + mn_input1.Value * 60 + se_input1.Value
    65. If totaltime <> 0 Then
    66. main_button1.Enabled = True
    67. hr_label1.Text = AddZero(totaltime \ 3600)
    68. mn_label1.Text = AddZero((totaltime Mod 3600) \ 60)
    69. se_label1.Text = AddZero((totaltime Mod 3600) Mod 60)
    70. main_button1.Text = "Start"
    71. set_button1.Enabled = False
    72. Else
    73. MsgBox("Felder dürfen nicht leer sein!")
    74. End If
    75. End Sub
    76. Private Sub main_button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles main_button1.Click
    77. If main_button1.Text = "Start" Or main_button1.Text = "Continue" Then
    78. hr_input1.Enabled = False
    79. mn_input1.Enabled = False
    80. se_input1.Enabled = False
    81. count1.Enabled = True
    82. main_button1.Text = "Stop"
    83. Else
    84. main_button1.Text = "Continue"
    85. hr_input1.Enabled = True
    86. mn_input1.Enabled = True
    87. se_input1.Enabled = True
    88. count1.Enabled = False
    89. set_button1.Enabled = True
    90. End If
    91. End Sub
    92. Private Sub count1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles count1.Tick
    93. If totaltime > 0 Then
    94. totaltime -= 1
    95. Else
    96. count1.Enabled = False
    97. MsgBox("Es is Zeit für AW: Flimmerland !")
    98. main_button1.Text = "Start"
    99. hr_input1.Enabled = True
    100. mn_input1.Enabled = True
    101. se_input1.Enabled = True
    102. count1.Enabled = False
    103. set_button1.Enabled = True
    104. End If
    105. hr_label1.Text = AddZero(totaltime \ 3600)
    106. mn_label1.Text = AddZero((totaltime Mod 3600) \ 60)
    107. se_label1.Text = AddZero((totaltime Mod 3600) Mod 60)
    108. End Sub
    109. Private Sub set_button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles set_button2.Click
    110. totaltime = hr_input2.Value * 60 * 60 + mn_input2.Value * 60 + se_input2.Value
    111. If totaltime <> 0 Then
    112. main_button2.Enabled = True
    113. hr_label2.Text = AddZero(totaltime \ 3600)
    114. mn_label2.Text = AddZero((totaltime Mod 3600) \ 60)
    115. se_label2.Text = AddZero((totaltime Mod 3600) Mod 60)
    116. main_button2.Text = "Start"
    117. set_button2.Enabled = False
    118. Else
    119. MsgBox("Felder dürfen nicht leer sein!")
    120. End If
    121. End Sub
    122. Private Sub main_button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles main_button2.Click
    123. If main_button2.Text = "Start" Or main_button2.Text = "Continue" Then
    124. hr_input2.Enabled = False
    125. mn_input2.Enabled = False
    126. se_input2.Enabled = False
    127. count2.Enabled = True
    128. main_button2.Text = "Stop"
    129. Else
    130. main_button2.Text = "Continue"
    131. hr_input2.Enabled = True
    132. mn_input2.Enabled = True
    133. se_input2.Enabled = True
    134. count2.Enabled = False
    135. set_button2.Enabled = True
    136. End If
    137. End Sub
    138. Private Sub count2_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles count2.Tick
    139. If totaltime > 0 Then
    140. totaltime -= 1
    141. Else
    142. count2.Enabled = False
    143. MsgBox("Es is Zeit für AW: Wundertunnel !")
    144. main_button2.Text = "Start"
    145. hr_input2.Enabled = True
    146. mn_input2.Enabled = True
    147. se_input2.Enabled = True
    148. count2.Enabled = False
    149. set_button2.Enabled = True
    150. End If
    151. hr_label2.Text = AddZero(totaltime \ 3600)
    152. mn_label2.Text = AddZero((totaltime Mod 3600) \ 60)
    153. se_label2.Text = AddZero((totaltime Mod 3600) Mod 60)
    154. End Sub
    155. End Class


    Und so sieht mein Tool aus:


    Ich hoffe ihr könnt mir helfen und erklären wie ich das behebe.
    Ich danke im Vorraus

    Mit freundlichen Grüßen
    Biro49
    Das zu erklären würde länger dauern, als es zu machen, und dir zu erklären.
    Daher schlage ich vor, du zippst deine Übung und hängst sie an.
    Mit zippen und anhängen selbst hast du auch schon eine Menge gelernt, denn ich bitte folgendes zu beachten:
    1. kein Fremdhoster
    2. Keine binaries - also lösche zuvor die Ordner bin und obj
    3. lauffähig - also teste, dass man deinen zip wirklich nur entpacken muss und starten kann
    Dann kannst du eiglich zügig geholfen werden ;)
    Und mach dich auf überraschend viel Kritk gefasst - ich sehe bereits jetzt, dass du mit ungünstigen Voreinstellungen programmierst.
    Je später man die korrigiert, desto umfangreicher werden Umdenken und Umbauen.

    Ein konzeptionelles Kernproblem scheint mir auch zu sein, dass du zwar für viele Raids CountDownse haben willst, aber sowas kann man nur machen, wenn man im Code auch viele Raids hat.
    Also das ist der Einstieg in Objekt-Orientierte Programmierung, denn du musst dir vmtl. eine Klasse Raid programmieren, und dann viele Raid-Objekte davon erstellen.
    Nur wenn du 50 Raid-Objekte hast, kannst du auch für 50 Raids die CountDownse programmieren.
    Was du ja selber sagst: für 1 Raid ging das wunnebar, mit mehreren nicht mehr.

    achso - zum Anhängen:

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

    Willkommen im Forum. :thumbup:

    Biro49 schrieb:

    für sich selbst zählt
    Da hast Du Dir ein klasse Paradestück für OOP - ObjektOrientierte Programmierung ausgesucht.
    Erstell eine Sicherungskopie Deines Projekts.
    Fang an mit dem einen Controller.
    Pack allen Code, den Du für den Countdown brauchst, in eine separate Klasse. Erstell Dir eine Instanz mit New und tune das ganze, bis es genau so läuft wie bisher.
    Dann erstellst Du 2 weitere Instanzen und behandelst sie parallel zur ersten wie diese.
    Wenn es mehr werden sollten, pack diese Instanzen in ein Array.
    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!
    Erstmal vielen Dank für die Antworten.
    Da habe ich mir ja anscheinend für den Anfang was schwieriges ausgesucht.

    Habe mein Projekt gezippt und angehängt wie gewünscht.

    ErfinderDesRades schrieb:

    Mit zippen und anhängen

    Und freue mich schon auf die Kritik, denn nur durch Kritik lernt man wie es besser geht.

    Werde nun versuchen das umzusetzen was RodFromGermany mir berschrieben hat.

    Mit freundlichen Grüßen
    Biro49
    Dateien

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

    Biro49 schrieb:

    wie es besser geht.
    3 Timer aber nur eine Variable, auf die alle Timer zum runterzählen zugreifen: totaltime.
    Sieh Dir mal den Typ TimeSpan und deren Ausgabeformate an.
    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!

    RodFromGermany schrieb:

    3 Timer aber nur eine Variable, auf die alle Timer zum runterzählen zugreifen: totaltime.


    Ich hab jetzt einfach mal folgende 2 Zeilen hinzugefügt und diezeilen von Timer2 und Timer3 editiert - jetzt funktioniert es.

    Visual Basic-Quellcode

    1. Dim totaltime1 As Long
    2. Dim totaltime2 As Long


    Wahrscheinlich nicht sehr elegant, aber es funktioniert schonmal.
    Jetzt muss ich noch lernen wie es eleganter geht. Als nächstes kommt das Studieren des Videos von ErfinderDesRades.

    Vielen Dank für eure Hilfe.

    Mit freundlichen Grüßen
    Biro49

    Biro49 schrieb:

    wie es eleganter geht
    Du brauchst nur einen Timer.
    Ruf in dessen Tick-Prozedur die ehemaligen 3 Timer123-Tick-Prozeduren auf.
    Richtig elegant wäre es, wenn Du Dir ein UserControl bautest, in dem alles passiert. Das könnte dann seinen eigenen Timer haben, und da kannst Du beliebig viele CountDowns managen.
    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!

    Cell schrieb:

    stopwatches
    für Wochen und Monate? :rolleyes:
    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 das nicht aber ich habe festgestellt, das je nachdem wie stark der rechner belastet wird der Timer nicht mehr ordentlich arbeitet wie er soll ... die stopwatch hat das Problem nicht. Wobei ich dazu sagen muss das die Zeitmessungen meiner Anwendungen wesenlich genauer sein müssen ;)

    Simpler Countdown - alle Timer extrem ungenau