Genaue Stopuhr mit Stopwatch geht das?

  • VB.NET
  • .NET (FX) 4.5–4.8

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

    Genaue Stopuhr mit Stopwatch geht das?

    Hallo ich habe mir einen Ballistischen Chrony gebaut und jetzt das Programm fertig!
    Nur ist dieses zu ungenau für meinen Zweck. Ich bräuchte nämlich die genauen Millisekunden auf die 3-4 Nachkomma Stelle.
    Werde nachher mal den Code hochladen.
    Der ganze Spaß wird durch den Mikrofoneingang gemessen.
    Da gibt es ne App die ist in VB6 programmiert die heißt „Softchrono“ die ist um einiges genauer als mein Programm!
    Freue mich über jeglich Antworten!
    @baulum Nein.
    Das Zauberwort heißt Multimedia-Timer.
    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!

    baulum schrieb:

    Nur ist dieses zu ungenau für meinen Zweck.

    Ohne zu wissen, was genau du Programmiert hast ist es jetzt schwer etwas dazu zu sagen. Die Stopwatch benutzt intern den QueryPerformanceCounter, welcher bereits die höchste Auflösung unter Windows bietet. Anders gesagt, genauer als Stopwatch wird es nicht. Du könntest noch die Priorität des Prozesses erhöhen um bessere Werte zu bekommen. Aber das sollte ja genau genug sein denn:

    C#-Quellcode

    1. for (int i = 0; i < 20; i++) {
    2. w.Restart();
    3. Math.Sqrt(random.Next());
    4. w.Stop();
    5. Console.WriteLine(w.Elapsed.TotalMilliseconds);
    6. }

    gibt mir bereits 4 nachkommastellen:
    0,0003 0,0001 0 0 0,0001 0 0,0001 0,0001
    Also was genau meinst du mit zu ungenau?
    Danke erstmal für die Antworten!

    Hier erstmal der Code:

    VB.NET-Quellcode

    1. Public Class Form1
    2. Private Declare Function mciSendString Lib "winmm.dll" Alias "mciSendStringA" (ByVal Command As String,
    3. Optional ByVal ReturnString As String = "", Optional ByVal ReturnLength As Integer = 0, Optional ByVal Callback As Integer = 0) As Integer
    4. Dim rs As String ' Returnstring
    5. Dim SoundLevel, Mode As New String("", 20)
    6. Dim kugelgewicht As Integer
    7. Dim laenge As Integer
    8. Dim stopwatch As New Stopwatch()
    9. Private firstResult, secondResult As Double
    10. Dim elapsed As TimeSpan = Me.stopwatch.Elapsed
    11. Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    12. Call mciSendString("Open New Type waveaudio Alias MySound", rs, 128, 0)
    13. Call mciSendString("record MySound", rs, 128, 0)
    14. Call mciSendString("Stop MySound", rs, 128, 0)
    15. ComboBox1.Text = "1"
    16. MaskedTextBox2.Text = My.Settings.Laenge
    17. MaskedTextBox1.Text = My.Settings.KugelGewicht
    18. MaskedTextBox3.Text = My.Settings.Eingang
    19. MaskedTextBox4.Text = My.Settings.Ausgang
    20. NumericUpDown1.Value = My.Settings.Offset
    21. End Sub
    22. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    23. Timer1.Enabled = True
    24. My.Settings.Laenge = MaskedTextBox2.Text
    25. My.Settings.Save()
    26. My.Settings.Reload()
    27. My.Settings.KugelGewicht = MaskedTextBox1.Text
    28. My.Settings.Save()
    29. My.Settings.Reload()
    30. My.Settings.Eingang = MaskedTextBox3.Text
    31. My.Settings.Save()
    32. My.Settings.Reload()
    33. My.Settings.Ausgang = MaskedTextBox4.Text
    34. My.Settings.Save()
    35. My.Settings.Reload()
    36. Button1.Enabled = False
    37. Button2.Enabled = True
    38. My.Settings.Offset = NumericUpDown1.Value
    39. My.Settings.Save()
    40. My.Settings.Reload()
    41. MaskedTextBox5.Text = "0"
    42. End Sub
    43. Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
    44. Timer1.Enabled = False
    45. TimerStart.Enabled = False
    46. Me.stopwatch.Reset()
    47. TimerStart.Stop()
    48. Me.stopwatch.Stop()
    49. Label15.Text = "00:00:00"
    50. Button1.Enabled = True
    51. Button2.Enabled = False
    52. TextBox2.Text = ""
    53. MaskedTextBox5.Text = ""
    54. TextBox1.Text = ""
    55. End Sub
    56. Private Sub Timer2_Tick(sender As Object, e As EventArgs) Handles Timer2.Tick
    57. Timer2.Stop()
    58. End Sub
    59. Private Sub Timer3_Tick(sender As Object, e As EventArgs) Handles Timer3.Tick
    60. Me.stopwatch.Reset()
    61. TextBox1.Text = ""
    62. TextBox2.Text = ""
    63. MaskedTextBox5.Text = ""
    64. Timer3.Stop()
    65. Label15.Text = "00:00:00"
    66. End Sub
    67. Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
    68. Dim Textbox2out As String = TextBox2.Text
    69. Dim ms As Integer = elapsed.Milliseconds
    70. Dim laenge As Integer = Convert.ToInt32(MaskedTextBox2.Text)
    71. Dim v As Double
    72. Dim j As Double
    73. Dim sl As Double = ProgressBar1.Value
    74. Timer1.Interval = ComboBox1.Text
    75. Timer2.Interval = NumericUpDown2.Value
    76. Dim cb As Double = 2
    77. Call mciSendString("status MySound level", SoundLevel, 20, cb)
    78. ProgressBar1.Value = Val(SoundLevel)
    79. Call mciSendString("status MySound mode", Mode, 128, cb)
    80. If ProgressBar1.Value >= MaskedTextBox3.Text Then
    81. TextBox1.Text = "Schuss erkannt!"
    82. Timer2.Enabled = True
    83. TimerStart.Start()
    84. Me.stopwatch.Start()
    85. End If
    86. If ProgressBar1.Value >= MaskedTextBox4.Text Then
    87. TimerStart.Enabled = False
    88. Me.stopwatch.Stop()
    89. Timer3.Enabled = True
    90. TextBox1.Text = "Schuss beendet"
    91. End If
    92. If TimerStart.Enabled = False Then
    93. Dim elapsed As TimeSpan = Me.stopwatch.Elapsed
    94. Label15.Text = String.Format("{0:00}:{1:00}:{2:00}", Math.Floor(elapsed.Minutes), elapsed.Seconds, elapsed.Milliseconds)
    95. TextBox2.Text = Val(MaskedTextBox2.Text * 10) / Val(elapsed.Milliseconds) + Val(NumericUpDown1.Value)
    96. TextBox2.Text = Math.Round(Val(TextBox2.Text), 2)
    97. End If
    98. If 1 + 1 = 2 Then
    99. MaskedTextBox5.Text = Val(MaskedTextBox1.Text) * ((Val(TextBox2.Text)) ^ 2) / 2000
    100. End If
    101. End Sub
    102. End Class
    103. 'Dim elapsed As TimeSpan = Me.stopwatch.Elapsed
    104. 'Label15.Text = String.Format("{0:00}:{1:00}:{2:00}", Math.Floor(elapsed.Minutes), elapsed.Seconds, elapsed.Milliseconds)



    So also mit zu ungenau meine ich, dass der die Schüsse meistens nicht erkennt... Mit der anderen Software aber schon!
    Das mit dem Multimedia Timer klingt interessant! Kannst du mir mal erklären wie ich den einbinde? Das habe ich leider nicht so richtig verstanden...

    Habe hier etwas gefunden habe dort aber nicht so richtig verstanden wie man diesen nutzt...

    Ich freue mich weiterhin auf eure Antworten! :thumbsup:
    Zeile#30-Z#Z46: WTF?!? Da die Settings standardmäßig automatisch beim Programmende gespeichert werden, kannst Du alle Save/Reload-Zeilen entfernen. Für das vorzeitige Speichern per Buttonklick reicht ein My.Settings.Save() am Ende jener Sub aber vollkommen aus.
    Call sollte man heutzutage (bis auf Kleinstausnahmen) nicht mehr verwenden. Einfach weglassen.
    If TimerStart.Enabled = False Then -> Boolean-Vergleiche mit True sind überflüssig.
    If ProgressBar1.Value >= MaskedTextBox3.Text Then, Timer1.Interval = ComboBox1.Text: WTF?!? Option Strict ON!
    Val() ist sowas von VB6.
    Und an der Benennung Deiner Controls solltest Du unbedingt arbeiten. Label15? TextBox2? Timer3? Da blickt doch keiner durch.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.

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