Korrektur-Timer - Frage

  • VB.NET
  • .NET (FX) 4.0

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

    TimeOfDay dürfte dir da etwas weiterhelfen: http://msdn.microsoft.com/en-us/library/system.datetime.timeofday(v=vs.110).aspx

    Oder auch diese Klasse hier: msdn.microsoft.com/en-us/libra….stopwatch(v=vs.110).aspx

    Sonst einfach verstrichene Millisekunden in Sekunden / Minuten / Stunden umrechnen.
    Danke für die Antworten.
    Hier mal mein Code für den Timer -

    VB.NET-Quellcode

    1. Private Sub Timer1_Tick(sender As System.Object, e As System.EventArgs) Handles Timer1.Tick
    2. lbmilli.Text += 1
    3. If lbmilli.Text = "10" Then
    4. lbmilli.Text = "0"
    5. lbsekunden.Text += 1
    6. If lbsekunden.Text = "60" Then
    7. lbsekunden.Text = "0"
    8. lbminuten.Text += 1
    9. End If
    10. End If


    Da dieser Timer sehr ungenau ist, benötige ich einen genaueren. Deshalb ja meine Frage.
    Der Timer aus dem Link ist sehr genau.

    Gruß Andreas

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

    Dass der sehr genau ist, liegt daran, dass er nicht mit Millisekunden, sondern mit glaub µ-Sekunden (also den Ticks) arbeitet. Der Timer wird pro Prozessor-Tick einmal aufgerufen, während ein normaler Timer, selbst wenn er auf 1ms steht, im Durchschnitt nur alle 10-24ms aufgerufen wird. Das hängt davon ab, wie schnell der Prozessor taktet, und wieviele andere Anwendungen sonst noch laufen.
    Du rechnest um. Der User, der den Timer gepostet hat, hat ja auch gesagt, dass er dir ein 10 Millionstel einer Sekunde zurück gibt.
    3 Sekunden = 3,984375

    Also rechnest du das jetzt in Stunden / Minuten / Sekunden um. Für eine Stopuhr würde Ich aber eher diese msdn.microsoft.com/en-us/libra….stopwatch(v=vs.110).aspx Klasse nehmen.
    Hi
    schnapp dir doch einfach eine Stopwatch und einen Timer und update im Timer den Text des Labels abhängig von der Stopwatch. Der Labeltext ändert sich dann halt nicht genau zu fixen Zeitpunkten an der Stopwatch, weil der Timer nicht sehr genau ist, aber für das Display kann dir das ja fast egal sein. Die Stopwatch hat in Elapsed eine TimeSpan, die entsprechend über ToString("hh:MM:ss") oder sowas in die Richtung ausgegeben werden kann.

    Gruß
    ~blaze~
    Zu dem Thema, wie man das umrechnet, das ist Mathe aus Klasse 3 oder 4. Aber wie Ich es schon 3 mal gesagt habe, und wie es auch @~blaze~ gesagt hat, nimm die StopWatch: msdn.microsoft.com/en-us/libra….stopwatch(v=vs.110).aspx

    Die geht auf die µ-Sekunde genau und ist viel einfacher.
    Ich danke Euch für die Antworten. Hier mein Code:

    VB.NET-Quellcode

    1. Public Class Form1
    2. Private TS As TimeSpan
    3. Private Zündtimer As New Stopwatch
    4. Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs)
    5. Timer1.Interval = 20
    6. Label44.Text = "00:00:00"
    7. End Sub
    8. Private Sub btstart_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btstart.Click
    9. Zündtimer.Reset()
    10. Zündtimer.Start()
    11. Me.Timer1.Start()
    12. End Sub
    13. Private Sub btstop_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btstop.Click
    14. TS = Zündtimer.Elapsed
    15. Zündtimer.Stop()
    16. Timer1.Stop()
    17. Label44.Text = Format(TS.Minutes, "00") & ":" & Format(TS.Seconds, "00") & ":" & Mid(Format(TS.Milliseconds, "000"), 1, 2)
    18. End Sub
    19. Private Sub Button4_Click(sender As System.Object, e As System.EventArgs) Handles btstop.Click
    20. Timer1.Stop()
    21. End Sub
    22. Private Sub Timer1_Tick(ByVal sender As Object, ByVal e As System.EventArgs) Handles Timer1.Tick
    23. TS = Zündtimer.Elapsed
    24. Label44.Text = Format(TS.Minutes, "00") & ":" & Format(TS.Seconds, "00") & ":" & Mid(Format(TS.Milliseconds, "000"), 1, 2)
    25. If TextBox1.Text = Label44.Text Then MessageBox.Show("Zündung 1")
    26. If TextBox2.Text = Label44.Text Then MessageBox.Show("Zündung 2")
    27. If TextBox3.Text = Label44.Text Then MessageBox.Show("Zündung 3")
    28. End Sub
    29. Private Sub Button3_Click(sender As System.Object, e As System.EventArgs) Handles Button3.Click
    30. Zündtimer.Reset()
    31. End Sub
    32. End Class


    Ich habe ein weiteres Problem. Ich vergleiche den Inhalt einer Textbox mit dem Zeitlabel, aber es funktioniert nicht immer, obwohl die die Werte über einstimmen.

    Was habe ich falsch gemacht?

    Gruß Andreas
    Kannst du dein Problem mal bitte etwas genauer formulieren? Was funktioniert denn da nicht? Kommt ein Fehler? Und benutze dafür bitte einen neuen Thread, da das 1. nichts mit dem Thema zu tun hat, und 2. dieser Thread sonst sehr unübersichtlich wird!

    LG :)
    Tut mir leid, das zu sagen, aber an dem Code sind verdammt viele Sachen einfach nur schlecht realisiert.

    - Die Bezeichnungen sind nicht aussagekräftig gewählt (Form1, Timer1, usw.)
    - Du hast mind. 44 Labels, was mit relativ hoher Wahrscheinlichkeit für einen Designfehler spricht
    - Du legst Properties in Form_Load fest, die auch in InitializeComponent festgelegt werden könnten
    - Du verwendest veraltete, wegen VB6-Kompatibilität verfügbare Methoden (Mid, Format)
    - Du vergleichst Strings statt den zugrundeliegenden Daten (z.B. TimeSpan-Objekte kann man wunderbar vergleichen, da wäre außerdem > super geeignet, um deinen Vergleich durchzuführen)

    Der ToString-Aufruf, den ich dir vorgeschlagen habe, wäre übrigens durchaus möglich, wenn man MM durch mm ersetzt. Anscheinend wäre ein möglicher Format-String [-][d’.’]hh’:’mm’:’ss[‘.’fffffff], wobei f sooft auftritt, wie du es genau haben willst. msdn.microsoft.com/en-us/library/ee372286(v=vs.110).aspx

    Gruß
    ~blaze~

    Hicki schrieb:

    VB.NET-Quellcode

    1. If TextBox1.Text = Label44.Text Then MessageBox.Show("Zündung 1")
    Ich wette, dass keine der MessageBoxen angezeigt wird, Du must die Prozedur auf die Milisekunde genau durchlaufen, das ist eher unwahrscheinlich.
    Zum Test von Zeitwerten nimm DateTime oder TimeSpan (je nach dem) und teste eine Toleranz ab, also

    VB.NET-Quellcode

    1. If jetzt >= vorhin AndAlso jetzt <= nachher Then MesageBox("Jetzt")
    Und ne MessageBox in der Timer.Tick-Prozedur ist ein NoGo.
    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 Leute,

    hier mein funktionierender Code:

    VB.NET-Quellcode

    1. Public Class Form1
    2. Dim stopwatch As New System.Diagnostics.Stopwatch
    3. Dim WithEvents Zünd_timer As New Timer
    4. Private Sub Zünd_Timer_Tick(ByVal sender As Object, ByVal e As EventArgs) Handles Zünd_timer.Tick
    5. Label_Time.Text = stopwatch.Elapsed.ToString.Remove(10)
    6. If TextBox1.Text = Label_Time.Text Then MessageBox.Show("Zündung 1")
    7. If TextBox2.Text = Label_Time.Text Then MessageBox.Show("Zündung 2")
    8. If TextBox3.Text = Label_Time.Text Then MessageBox.Show("Zündung 3")
    9. If TextBox4.Text = Label_Time.Text Then MessageBox.Show("Zündung 4")
    10. If TextBox5.Text = Label_Time.Text Then MessageBox.Show("Zündung 5")
    11. If TextBox6.Text = Label_Time.Text Then MessageBox.Show("Zündung 6")
    12. If TextBox7.Text = Label_Time.Text Then MessageBox.Show("Zündung 7")
    13. If TextBox8.Text = Label_Time.Text Then MessageBox.Show("Zündung 8")
    14. If TextBox9.Text = Label_Time.Text Then MessageBox.Show("Zündung 9")
    15. If TextBox10.Text = Label_Time.Text Then MessageBox.Show("Zündung 10")
    16. If TextBox11.Text = Label_Time.Text Then MessageBox.Show("Zündung 11")
    17. If TextBox12.Text = Label_Time.Text Then MessageBox.Show("Zündung 12")
    18. If TextBox13.Text = Label_Time.Text Then MessageBox.Show("Zündung 13")
    19. If TextBox14.Text = Label_Time.Text Then MessageBox.Show("Zündung 14")
    20. If TextBox15.Text = Label_Time.Text Then MessageBox.Show("Zündung 15")
    21. If TextBox16.Text = Label_Time.Text Then MessageBox.Show("Zündung 16")
    22. If TextBox17.Text = Label_Time.Text Then MessageBox.Show("Zündung 17")
    23. If TextBox18.Text = Label_Time.Text Then MessageBox.Show("Zündung 18")
    24. If TextBox19.Text = Label_Time.Text Then MessageBox.Show("Zündung 19")
    25. If TextBox20.Text = Label_Time.Text Then MessageBox.Show("Zündung 20")
    26. If TextBox21.Text = Label_Time.Text Then MessageBox.Show("Zündung 21")
    27. If TextBox22.Text = Label_Time.Text Then MessageBox.Show("Zündung 22")
    28. If TextBox23.Text = Label_Time.Text Then MessageBox.Show("Zündung 23")
    29. If TextBox24.Text = Label_Time.Text Then MessageBox.Show("Zündung 24")
    30. If TextBox25.Text = Label_Time.Text Then MessageBox.Show("Zündung 25")
    31. If TextBox26.Text = Label_Time.Text Then MessageBox.Show("Zündung 26")
    32. If TextBox27.Text = Label_Time.Text Then MessageBox.Show("Zündung 27")
    33. If TextBox28.Text = Label_Time.Text Then MessageBox.Show("Zündung 28")
    34. If TextBox29.Text = Label_Time.Text Then MessageBox.Show("Zündung 29")
    35. If TextBox30.Text = Label_Time.Text Then MessageBox.Show("Zündung 30")
    36. If TextBox31.Text = Label_Time.Text Then MessageBox.Show("Zündung 31")
    37. If TextBox32.Text = Label_Time.Text Then MessageBox.Show("Zündung 32")
    38. If TextBox33.Text = Label_Time.Text Then MessageBox.Show("Zündung 33")
    39. If TextBox34.Text = Label_Time.Text Then MessageBox.Show("Zündung 34")
    40. If TextBox35.Text = Label_Time.Text Then MessageBox.Show("Zündung 35")
    41. If TextBox36.Text = Label_Time.Text Then MessageBox.Show("Zündung 36")
    42. If TextBox37.Text = Label_Time.Text Then MessageBox.Show("Zündung 37")
    43. If TextBox38.Text = Label_Time.Text Then MessageBox.Show("Zündung 38")
    44. If TextBox39.Text = Label_Time.Text Then MessageBox.Show("Zündung 39")
    45. If TextBox40.Text = Label_Time.Text Then MessageBox.Show("Zündung 40")
    46. End Sub
    47. Private Sub Button_Time_Start_Click(sender As System.Object, e As System.EventArgs) Handles Button_Time_Start.Click
    48. If Button_Time_Start.Text = "Start" Then
    49. Button_Time_Start.Text = "Pause"
    50. Zünd_timer.Start()
    51. stopwatch.Start()
    52. Else
    53. stopwatch.Stop()
    54. Button_Time_Start.Text = "Start"
    55. End If
    56. End Sub
    57. Private Sub Button_Time_Stop_Click(sender As System.Object, e As System.EventArgs) Handles Button_Time_Stop.Click
    58. Label_Time.Text = "00:00:00.0"
    59. Button_Time_Start.Text = "Start"
    60. Zünd_timer.Stop()
    61. stopwatch.Reset()
    62. End Sub
    63. End Class


    Nochmals vielen Dank für die Hilfe.

    Gruß Andreas

    Hicki schrieb:

    VB.NET-Quellcode

    1. If TextBox1.Text = Label_Time.Text Then
    Vergleiche DateTime-Objekte, keine Strings.
    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!
    Ist das der richtige Weg? Warum ist meine vorhergehende Variante nicht möglich?

    VB.NET-Quellcode

    1. Dim t1 As DateTime = DateTime.Parse(Label_Time.Text)
    2. Dim t2 As DateTime = DateTime.Parse(TextBox1.Text)
    3. If t1 = t2 Then MessageBox.Show("Zündung-Neu")




    Gruß Andreas

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „Hicki“ ()

    Wurde schon gesagt: Es liegt hier ein grundlegender Architektur-Fehler vor, vermutlich hast du drauflos-geproggt, ohne iwelche konzeptionelle Überlegungen.
    Wenn deine Variante läuft, dann ist ja gut.

    Wenn du's sauberer, performanter, resourcenschondender lösen willst, musst du erstmal das Konzept von Datenmodellierung verstehen.
    Dann denkst du dir ein zu deim Problem passendes Datenmodell aus, und das bischen Funktionalität lässt sich dann leicht dran-programmieren.

    Das schwierige sind die Grundlagen - dir scheint es ja noch kaum einen Unterschied zu machen, ob du Strings vergleichst, DateTimes oder Timespans
    Also schon beim Verständnis des Konzepts "Datentyp" haperts - Wie sollst du da zum Datenmodell-Konzept kommen?

    Also Verbesserungen kann man schon einige vorschlagen, aber "richtig" täte mans halt ganz anners anfassen, und das nimmt einem bisserl die Lust am Herum-verbessern - geht mir jdfs so.