Hallo zusammen,
Folgendes Szenario: Man drückt zum Beispiel die Taste F1 runter. Egal, wie lange man drückt, der Code für das Runterdrücken wird nur einmal ausgeführt. Man kann beliebig lange drücken, aber es muss mindestens 4 Sekunden dauern, bis der Code für das Loslassen ausgeführt werden darf. Egal, ob man so lange gedrückt hat oder nicht, die 4 Sekunden werden gesleept.
Wenn mindestens 4 Sekunden bereits um sind (also man 4 Sekunden gedrückt hat), darf sofort der Code für das Loslassen der Taste ausgeführt werden. Ansonsten halt warten.
Das funktioniert auch gut. Allerdings würde ich es gerne hinbekommen, dass, wenn bereits 3 Sekunden um sind, nur noch die 1 Sekunde gewartet werden muss, um die 4 vollzumachen. Und da habe ich gerade einen Knoten im Kopf. Ich habe vorhin schon der Prozedur
Warum das Ganze? Ich möchte demnächst ein Labornetzteil über die RS232 ansteuern und einem Analogmotor verschiedene Spannungen geben. Der Grund für die Wartezeit ist, dass das Netzteil circa 4 Sekunden braucht, bevor der nächste Befehl kommen kann.
Lässt sich hier noch etwas zusammenfassen?
Spoiler anzeigen
Folgendes Szenario: Man drückt zum Beispiel die Taste F1 runter. Egal, wie lange man drückt, der Code für das Runterdrücken wird nur einmal ausgeführt. Man kann beliebig lange drücken, aber es muss mindestens 4 Sekunden dauern, bis der Code für das Loslassen ausgeführt werden darf. Egal, ob man so lange gedrückt hat oder nicht, die 4 Sekunden werden gesleept.
Wenn mindestens 4 Sekunden bereits um sind (also man 4 Sekunden gedrückt hat), darf sofort der Code für das Loslassen der Taste ausgeführt werden. Ansonsten halt warten.
Das funktioniert auch gut. Allerdings würde ich es gerne hinbekommen, dass, wenn bereits 3 Sekunden um sind, nur noch die 1 Sekunde gewartet werden muss, um die 4 vollzumachen. Und da habe ich gerade einen Knoten im Kopf. Ich habe vorhin schon der Prozedur
Warten()
eine TimeSpan übergeben und diese mit Math.Abs()
auf ein positives Vorzeichen gebracht, aber da wurde viel zu wenig gesleept …Warum das Ganze? Ich möchte demnächst ein Labornetzteil über die RS232 ansteuern und einem Analogmotor verschiedene Spannungen geben. Der Grund für die Wartezeit ist, dass das Netzteil circa 4 Sekunden braucht, bevor der nächste Befehl kommen kann.
Lässt sich hier noch etwas zusammenfassen?
VB.NET-Quellcode
- Imports Microsoft.VisualBasic.ControlChars
- Public NotInheritable Class FormMain
- Private F1_is_pressed, F2_is_pressed, F5_is_pressed, F6_is_pressed, F9_is_pressed, F10_is_pressed As Boolean
- Private Zeit1 As Date
- Private Zeit2 As Date
- Private Sub FormMain_KeyDown(sender As Object, e As KeyEventArgs) Handles MyBase.KeyDown
- If e.KeyCode = Keys.F1 AndAlso Not F1_is_pressed Then
- F1_is_pressed = True
- Zeit1 = Date.Now
- Zeit2 = Date.Now
- Langsam_vorwaerts_Start()
- ElseIf e.KeyCode = Keys.F2 AndAlso Not F2_is_pressed Then
- F2_is_pressed = True
- Zeit1 = Date.Now
- Zeit2 = Date.Now
- Langsam_rueckwaerts_Start()
- ElseIf e.KeyCode = Keys.F5 AndAlso Not F5_is_pressed Then
- F5_is_pressed = True
- Zeit1 = Date.Now
- Zeit2 = Date.Now
- Mittel_vorwaerts_Start()
- ElseIf e.KeyCode = Keys.F6 AndAlso Not F6_is_pressed Then
- F6_is_pressed = True
- Zeit1 = Date.Now
- Zeit2 = Date.Now
- Mittel_rueckwaerts_Start()
- ElseIf e.KeyCode = Keys.F9 AndAlso Not F9_is_pressed Then
- F9_is_pressed = True
- Zeit1 = Date.Now
- Zeit2 = Date.Now
- Schnell_vorwaerts_Start()
- ElseIf e.KeyCode = Keys.F10 AndAlso Not F10_is_pressed Then
- F10_is_pressed = True
- Zeit1 = Date.Now
- Zeit2 = Date.Now
- Schnell_rueckwaerts_Start()
- Else
- Exit Sub
- End If
- End Sub
- Private Sub FormMain_KeyUp(sender As Object, e As KeyEventArgs) Handles MyBase.KeyUp
- If e.KeyCode = Keys.F1 AndAlso F1_is_pressed Then
- F1_is_pressed = False
- Zeit2 = Date.Now
- Langsam_vorwaerts_Stopp()
- ElseIf e.KeyCode = Keys.F2 AndAlso F2_is_pressed Then
- F2_is_pressed = False
- Zeit2 = Date.Now
- Langsam_rueckwaerts_Stopp()
- ElseIf e.KeyCode = Keys.F5 AndAlso F5_is_pressed Then
- F5_is_pressed = False
- Zeit2 = Date.Now
- Mittel_vorwaerts_Stopp()
- ElseIf e.KeyCode = Keys.F6 AndAlso F6_is_pressed Then
- F6_is_pressed = False
- Zeit2 = Date.Now
- Mittel_rueckwaerts_Stopp()
- ElseIf e.KeyCode = Keys.F9 AndAlso F9_is_pressed Then
- F9_is_pressed = False
- Zeit2 = Date.Now
- Schnell_vorwaerts_Stopp()
- ElseIf e.KeyCode = Keys.F10 AndAlso F10_is_pressed Then
- F10_is_pressed = False
- Zeit2 = Date.Now
- Schnell_rueckwaerts_Stopp()
- Else
- Exit Sub
- End If
- End Sub
- Private Sub Langsam_vorwaerts_Start()
- Label_Richtung.Text = "Langsam vorwärts Start"
- Label_Richtung.Update()
- Zeit1 = Zeit1.AddSeconds(4)
- If Not Zeit2 > Zeit1 Then
- Warten()
- End If
- End Sub
- Private Sub Langsam_rueckwaerts_Start()
- Label_Richtung.Text = "Langsam rückwärts Start"
- Label_Richtung.Update()
- Zeit1 = Zeit1.AddSeconds(4)
- If Not Zeit2 > Zeit1 Then
- Warten()
- End If
- End Sub
- Private Sub Mittel_vorwaerts_Start()
- Label_Richtung.Text = "Mittel vorwärts Start"
- Label_Richtung.Update()
- Zeit1 = Zeit1.AddSeconds(4)
- If Not Zeit2 > Zeit1 Then
- Warten()
- End If
- End Sub
- Private Sub Mittel_rueckwaerts_Start()
- Label_Richtung.Text = "Mittel rückwärts Start"
- Label_Richtung.Update()
- Zeit1 = Zeit1.AddSeconds(4)
- If Not Zeit2 > Zeit1 Then
- Warten()
- End If
- End Sub
- Private Sub Schnell_vorwaerts_Start()
- Label_Richtung.Text = "Schnell vorwärts Start"
- Label_Richtung.Update()
- Zeit1 = Zeit1.AddSeconds(4)
- If Not Zeit2 > Zeit1 Then
- Warten()
- End If
- End Sub
- Private Sub Schnell_rueckwaerts_Start()
- Label_Richtung.Text = "Schnell rückwärts Start"
- Label_Richtung.Update()
- Zeit1 = Zeit1.AddSeconds(4)
- If Not Zeit2 > Zeit1 Then
- Warten()
- End If
- End Sub
- Private Sub Langsam_vorwaerts_Stopp()
- Label_Richtung.Text = "Langsam vorwärts Stopp"
- Label_Richtung.Update()
- Zeit1 = Zeit1.AddSeconds(4)
- If Not Zeit2 > Zeit1 Then
- Warten()
- End If
- End Sub
- Private Sub Langsam_rueckwaerts_Stopp()
- Label_Richtung.Text = "Langsam rückwärts Stopp"
- Label_Richtung.Update()
- Zeit1 = Zeit1.AddSeconds(4)
- If Not Zeit2 > Zeit1 Then
- Warten()
- End If
- End Sub
- Private Sub Mittel_vorwaerts_Stopp()
- Label_Richtung.Text = "Mittel vorwärts Stopp"
- Label_Richtung.Update()
- Zeit1 = Zeit1.AddSeconds(4)
- If Not Zeit2 > Zeit1 Then
- Warten()
- End If
- End Sub
- Private Sub Mittel_rueckwaerts_Stopp()
- Label_Richtung.Text = "Mittel rückwärts Stopp"
- Label_Richtung.Update()
- Zeit1 = Zeit1.AddSeconds(4)
- If Not Zeit2 > Zeit1 Then
- Warten()
- End If
- End Sub
- Private Sub Schnell_vorwaerts_Stopp()
- Label_Richtung.Text = "Schnell vorwärts Stopp"
- Label_Richtung.Update()
- Zeit1 = Zeit1.AddSeconds(4)
- If Not Zeit2 > Zeit1 Then
- Warten()
- End If
- End Sub
- Private Sub Schnell_rueckwaerts_Stopp()
- Label_Richtung.Text = "Schnell rückwärts Stopp"
- Label_Richtung.Update()
- Zeit1 = Zeit1.AddSeconds(4)
- If Not Zeit2 > Zeit1 Then
- Warten()
- End If
- End Sub
- Private Shared Sub Warten()
- System.Threading.Thread.Sleep(4000)
- End Sub
- End Class