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
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.
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):
VB.NET-Quellcode
- Public Class Form1
- Dim t As Threading.Thread
- Dim mx As Long = Long.MinValue
- Private Sub foo()
- ' Erstmal warm laufen
- Dim stp As New Stopwatch
- For i = 1 To 10
- Threading.Thread.Sleep(0)
- Next
- Do
- stp = Stopwatch.StartNew
- ' Ein ganz klein wenig Prozessorzeit abgeben, damit das System nicht vällig aus
- ' dem Tritt kommt!
- Threading.Thread.Sleep(1)
- ' Ansonsten sollten hir nur Sachen hin, die GAAAAAAANZ kurz laufen!
- stp.Stop()
- ' Schaun wir mal, wie lange das ganze gedauert hat:
- If stp.ElapsedTicks > mx Then
- mx = stp.ElapsedTicks
- ' Wenn MX ein neuer Wert ist UND größer als eine Millisekunden,
- ' dann geben wir den Wert aus
- If mx > 10000 Then
- Me.BeginInvoke(Sub() ListBox1.Items.Add(mx / 10000))
- End If
- End If
- Loop
- End Sub
- Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
- If t Is Nothing Then
- ' Eigene Priority auf Maximum. GEFÄÄÄÄÄHRLICH!
- Process.GetCurrentProcess.PriorityClass = ProcessPriorityClass.RealTime
- t = New Threading.Thread(AddressOf foo)
- t.IsBackground = True
- ' Und den Thread auch gleich noch auf Max
- t.Priority = Threading.ThreadPriority.Highest
- t.Start()
- Button1.Text = "Zeige Zeit"
- Else
- ' Mal Zeit anzeigen
- Me.BeginInvoke(Sub() ListBox1.Items.Add(mx / 10000))
- End If
- End Sub
- Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
- Button1.Text = "Starte Thread"
- End Sub
- 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.