我正在使用一个While循环,它根据用户输入的值循环一定数量的循环(1-576)。用户单击“开始”按钮激活它,但我希望能够使用“Escape”键取消它。
然而,当循环进行时,我无法让程序识别任何按键。
Private Sub OnGlobalKeyDown(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles kh.KeyDown
lblInput.Text = String.Format("'{0}' Code:{1}", e.KeyCode, CInt(e.KeyCode).ToString())
If e.KeyCode = CType(27, Keys) Then
count = 0
loops = 0
End If
End Sub
My Loop
Private Sub RUNLOOP()
While loops >= 1
' my code that runs in the loop
loop = loop - 1
End While
End Sub
当循环运行时,我的按键不会注册,否则它们会正常注册。
答案 0 :(得分:5)
您是否考虑过使用BackgroundWorker
在后台线程making sure your GUI keeps responsive中执行while循环代码(=调整/重绘表单并让用户“达到”您实现取消的方式在循环中不需要Application.DoEvents
来“伪造”这种行为吗?
如果您已经在.NET Framework 4.0上,则可以尝试使用parallel programming而不是BackgroundWorker
。
答案 1 :(得分:2)
这有两种方法。您可以为循环使用单独的线程,也可以使用Application.DoEvents()。线程方法通常会给你最好的结果。
螺纹:
您只需调用StopLoop()告诉循环停止运行。你不想设置loop = 0,因为那时你必须使用Interlocked类来确保在线程之间正确设置循环。
Private Sub RunLoop()
Dim loop As Action = AddressOf InternalRunLoop
loop.BeginInvoke(null, null)
End Sub
Private bStopLoop As Boolean
Private Sub InternalRunLoop()
While loops >= 1 And Not bStopLoop
' my code that runs in the loop
loop = loop - 1
End While
End Sub
Private Sub StopLoop()
bStopLoop = True
End Sub
的DoEvents:
调用Application.DoEvents()将导致窗口线程上的所有挂起事件被处理。如果循环的每次迭代都需要一些时间,那么应用程序仍会对用户显示为无响应,这就是首选线程方法的原因。
Private SubRunLoop()
While loops >= 1 And Not bStopLoop
' my code that runs in the loop
loop = loop - 1
Application.DoEvents()
End While
End Sub
答案 2 :(得分:-1)
在循环中放置以下代码:
Application.DoEvents()
答案 3 :(得分:-3)
While counter <= 10
' skip remaining code in loop only if counter = 7
If counter = 7 Then
Exit While
End If
counter += 1
End While