Hallo liebes Forum,
ich war vorhin an einem anderen Projekt zugange und habe etwas festgestellt. Aber von vorne:
Ich hab 'ne Form, zwei Buttons und einen Timer.
In der Sub von Button_Start gibt es meine While-Schleife. Diese wird nur abgebrochen, wenn Button_Stopp gedrückt wird, weil der den Boolean
In der While-Schleife befindet sich ein
Wie bekomme ich diesen Aufbau sauberer hin? Die Stopwatch meldet alles von 39 Millisekunden bis 50. Aber nie konstant 40 (naja, wenn es 45 wären....)
Wie gesagt, ich habe ein extra Testprojekt erstellt, füge ich hinzu. Damit's nachstellbar ist.
Danke und einen schönen Abend
ich war vorhin an einem anderen Projekt zugange und habe etwas festgestellt. Aber von vorne:
Ich hab 'ne Form, zwei Buttons und einen Timer.
In der Sub von Button_Start gibt es meine While-Schleife. Diese wird nur abgebrochen, wenn Button_Stopp gedrückt wird, weil der den Boolean
Abbruch
auf true setzt. In der While-Schleife befindet sich ein
If
, dessen Bedingung nur True wird, wenn der Timer feuert (alle 40 ms). Also wenn der nicht kommt, läuft die While-Schleife vor sich hin. Die Sache ist, in meinem If befindet sich Code, der genau getimet sein muss. Es geht um Videobearbeitung. Ich brauche mindestens ein Application.DoEvents()
; mit einem zweiten läuft wiederum alles sehr unruhig (das sehe ich an den Diagnosetools). Wenn gar kein Application.DoEvents
da ist, hört das Programm nicht mehr auf Button_Stop (App hängt), sogar schlimmer, Run
wird nicht mehr auf True gesetzt . Als wenn der Timer nicht mehr durchkommt. Wie bekomme ich diesen Aufbau sauberer hin? Die Stopwatch meldet alles von 39 Millisekunden bis 50. Aber nie konstant 40 (naja, wenn es 45 wären....)
Wie gesagt, ich habe ein extra Testprojekt erstellt, füge ich hinzu. Damit's nachstellbar ist.
Danke und einen schönen Abend
VB.NET-Quellcode
- 'Option Strict On wurde in den Projekteigenschaften festgelegt!
- Public NotInheritable Class Form1
- Private Run As Boolean = False
- Private Abbruch As Boolean = False
- Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
- Me.KeyPreview = True
- End Sub
- Private Sub Button_Start_Click(sender As Object, e As EventArgs) Handles Button_Start.Click
- Timer1.Enabled = True
- Application.DoEvents()
- Dim stopWatch As New Stopwatch()
- While Not Abbruch 'solange nicht Stopp gedrückt wurde...
- stopWatch.Start()
- If Run Then 'und wenn der Timer gerade feuert...
- 'tu etwas!
- stopWatch.Stop()
- TextBox1.Text = stopWatch.ElapsedMilliseconds.ToString
- stopWatch.Reset()
- 'Application.DoEvents()
- Run = False
- End If
- Application.DoEvents() 'wenn auskommentiert, hört er nicht mehr auf den Button_Stopp und setzt Run nicht auf True
- End While
- TextBox1.Text = "gestoppt"
- End Sub
- Private Sub Button_Stopp_Click(sender As Object, e As EventArgs) Handles Button_Stopp.Click
- Timer1.Enabled = False
- Run = False
- Abbruch = True
- End Sub
- Private Sub Timer1_Tick(sender As Object, e As EventArgs) Handles Timer1.Tick
- Run = True
- End Sub
- Private Sub Form1_KeyDown(sender As Object, e As KeyEventArgs) Handles MyBase.KeyDown
- If e.KeyCode = Keys.Escape Then
- Button_Stopp_Click(0, Nothing)
- End If
- End Sub
- End Class