Echtzeit Verhalten

    • Allgemein

      Echtzeit Verhalten

      Aufgrund Anfrage eines Users, hier mal ein Tip:

      Wenn es darum geht, etwas in SEHR kurzen Zeitabständen zu tun, zu prüfen, dann ist Windows dafür nicht sonderlich gut. Einen kleinen "Trick" gibt es aber, dass die Verarbeitungszeit nicht ZU groß wird (durch Multithreading und Garbage Collection landet man schnell in Bereichen von mehreren 100 Millisekunden):

      Spoiler anzeigen

      VB.NET-Quellcode

      1. Public Class Form1
      2. Dim t As Threading.Thread
      3. Dim mx As Long = Long.MinValue
      4. Private Sub foo()
      5. ' Erstmal warm laufen
      6. Dim stp As New Stopwatch
      7. For i = 1 To 10
      8. Threading.Thread.Sleep(0)
      9. Next
      10. Do
      11. stp = Stopwatch.StartNew
      12. ' Ein ganz klein wenig Prozessorzeit abgeben, damit das System nicht vällig aus
      13. ' dem Tritt kommt!
      14. Threading.Thread.Sleep(1)
      15. ' Ansonsten sollten hir nur Sachen hin, die GAAAAAAANZ kurz laufen!
      16. stp.Stop()
      17. ' Schaun wir mal, wie lange das ganze gedauert hat:
      18. If stp.ElapsedTicks > mx Then
      19. mx = stp.ElapsedTicks
      20. ' Wenn MX ein neuer Wert ist UND größer als eine Millisekunden,
      21. ' dann geben wir den Wert aus
      22. If mx > 10000 Then
      23. Me.BeginInvoke(Sub() ListBox1.Items.Add(mx / 10000))
      24. End If
      25. End If
      26. Loop
      27. End Sub
      28. Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
      29. If t Is Nothing Then
      30. ' Eigene Priority auf Maximum. GEFÄÄÄÄÄHRLICH!
      31. Process.GetCurrentProcess.PriorityClass = ProcessPriorityClass.RealTime
      32. t = New Threading.Thread(AddressOf foo)
      33. t.IsBackground = True
      34. ' Und den Thread auch gleich noch auf Max
      35. t.Priority = Threading.ThreadPriority.Highest
      36. t.Start()
      37. Button1.Text = "Zeige Zeit"
      38. Else
      39. ' Mal Zeit anzeigen
      40. Me.BeginInvoke(Sub() ListBox1.Items.Add(mx / 10000))
      41. End If
      42. End Sub
      43. Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
      44. Button1.Text = "Starte Thread"
      45. End Sub
      46. End Class


      Wer mag, kann das Programm mal laufen lassen und den Rechner ansonsten auch noch mal kräftig auslasten. Wäre mal interessant, was ihr dann so für Zeiten erhaltet.