Hi,
ich habe einige Routinen, die sehr langlaufende Schleifen erzeugen.
Manchmal bereue ich den Start der Routine und würde sie gern mit einem Tastendruck, etwa ESCAPE oder LCTRL unterbrechen.
Zum Testen verwende ich folgende Routine:
Die Routine läuft ziemlich genau 2 Sekunden. Ich habe versucht, sie über das KeyDown Event (natürlich mit KeyPreview=True) versucht zu unterbrechen:
Leider funktioniert das nicht ... hier sind die Debug Messages:
Offensichtlich wird das KeyDown Event "pending" gehalten ... und feuert erst NACHDEM die Schleife beendet wurde.
Ich habe versucht das alternativ über "GetState" abzuwickeln:
Und auch über einen Timer hab ich das versucht:
Bei allen Versuchen ist das Ergebnis das Gleiche: Der Tastendruck wird erst NACH ENDE der Schleife erkannt und ist damit zu spät wirksam ! Und das ist natürlich blöde, weil die Schleife eben nicht abgebrochen wird !
Ich nehme an, dass den Spezialisten im Forum dieses Phänomen bekannt ist. Und vielleicht gibt es dafür dann ja auch eine ganz hausbackene Lösung. Nur ich komme halt trotz alle Mühe nicht drauf.
Kann mir jemand (gewohnt freundlich und nachsichtig) auf die Sprünge helfen ?
LG
Peter
ich habe einige Routinen, die sehr langlaufende Schleifen erzeugen.
Manchmal bereue ich den Start der Routine und würde sie gern mit einem Tastendruck, etwa ESCAPE oder LCTRL unterbrechen.
Zum Testen verwende ich folgende Routine:
VB.NET-Quellcode
- Private Sub PerformLoop()
- Debug.Print("")
- DebugPrint("LOOP started")
- blnIntercepted = False
- For i = 1 To 10
- DebugPrint("LOOP i=" & i.ToString)
- If blnIntercepted Then
- DebugPrint("LOOP intercepted")
- Exit For
- End If
- Thread.Sleep(200)
- Next
- DebugPrint("LOOP Ended")
- End Sub
- Private Sub DebugPrint(_message As String)
- Debug.Print(Date.Now.ToString("HH:mm:ss") & ": " &
- " Intercepted=" & blnIntercepted.ToString.PadRight(6, " "c) &
- _message)
- End Sub
Die Routine läuft ziemlich genau 2 Sekunden. Ich habe versucht, sie über das KeyDown Event (natürlich mit KeyPreview=True) versucht zu unterbrechen:
Leider funktioniert das nicht ... hier sind die Debug Messages:
Quellcode
- 11:28:37: Intercepted=False LOOP started
- 11:28:37: Intercepted=False LOOP i=1
- 11:28:37: Intercepted=False LOOP LCTRL1=False
- 11:28:37: Intercepted=False LOOP i=2
- 11:28:37: Intercepted=False LOOP LCTRL1=False
- 11:28:37: Intercepted=False LOOP i=3
- 11:28:37: Intercepted=False LOOP LCTRL1=False
- 11:28:38: Intercepted=False LOOP i=4
- 11:28:38: Intercepted=False LOOP LCTRL1=False
- 11:28:38: Intercepted=False LOOP i=5
- 11:28:38: Intercepted=False LOOP LCTRL1=False
- 11:28:38: Intercepted=False LOOP i=6
- 11:28:38: Intercepted=False LOOP LCTRL1=False
- 11:28:38: Intercepted=False LOOP i=7
- 11:28:38: Intercepted=False LOOP LCTRL1=False
- 11:28:38: Intercepted=False LOOP i=8
- 11:28:38: Intercepted=False LOOP LCTRL1=False
- 11:28:39: Intercepted=False LOOP i=9
- 11:28:39: Intercepted=False LOOP LCTRL1=False
- 11:28:39: Intercepted=False LOOP i=10
- 11:28:39: Intercepted=False LOOP LCTRL1=False
- 11:28:39: Intercepted=False LOOP Ended
- 11:28:39: Intercepted=False KEY DOWN
- 11:28:39: Intercepted=True KEY DOWN Escape depressed
Offensichtlich wird das KeyDown Event "pending" gehalten ... und feuert erst NACHDEM die Schleife beendet wurde.
Ich habe versucht das alternativ über "GetState" abzuwickeln:
Und auch über einen Timer hab ich das versucht:
VB.NET-Quellcode
- Private Sub Timer1_Tick(sender As Object, e As EventArgs) Handles Timer1.Tick
- DebugPrint("TIMER1 TICK")
- Dim myKeyState2 As Short = GetKeyState(Keys.LControlKey)
- Dim LCTRL2 As Boolean = False
- If myKeyState2 = -127 OrElse myKeyState2 = -128 Then LCTRL2 = True
- If LCTRL2 Then
- blnIntercepted = True
- DebugPrint("TIMER1 TICK LCTRL2=" & LCTRL2.ToString)
- End If
- End Sub
Bei allen Versuchen ist das Ergebnis das Gleiche: Der Tastendruck wird erst NACH ENDE der Schleife erkannt und ist damit zu spät wirksam ! Und das ist natürlich blöde, weil die Schleife eben nicht abgebrochen wird !
Ich nehme an, dass den Spezialisten im Forum dieses Phänomen bekannt ist. Und vielleicht gibt es dafür dann ja auch eine ganz hausbackene Lösung. Nur ich komme halt trotz alle Mühe nicht drauf.
Kann mir jemand (gewohnt freundlich und nachsichtig) auf die Sprünge helfen ?
LG
Peter
Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „Peter329“ ()