退出 2 for 循环按 esc 按钮
Exit 2 for loops pressing esc button
我正在使用 vb.net 进行编码。该程序遍历图片框中的每个像素,检查并比较用户选择的颜色。当用户按下键盘上的 ESC 按钮时,我编写了一个代码来停止循环。但是看起来当按下 esc 时程序并没有停止。
我制作了一个在按下 esc 按钮时弹出的消息框。当循环为 运行 并且我按下 esc 按钮时,仅当整个循环完成时才会弹出消息框。
For x = rect.X To endPointX - 1 Step pixelStep
For y = endpointY - 1 To rect.Y Step -1
If e.X >= 0 And e.Y >= 0 And (e.X < PictureBox1.Width) And (e.Y < PictureBox1.Height) Then
If escPress Then
Exit For
End If
If bmp.GetPixel(x, y) = cor Then
cruzNoBitmap(PictureBox1, n, pemSize, x, y)
addRow(x, y)
Exit For
End If
End If
Next
If escPress Then
Exit For
End If
Next
Private Sub frmBitmaps_KeyDown(sender As Object, e As System.Windows.Forms.KeyEventArgs) Handles Me.KeyDown
If e.KeyCode = Keys.Escape Then
MsgBox("test")
escPress = True
End If
End Sub
如有帮助,我将不胜感激。
因为你有一个单线程,按钮函数在循环结束之前不会触发。
您可以通过使 x 和 y 成为全局整数并将它们显示在消息框中来确认这一点。
如果您希望能够退出,则需要创建第二个线程,并运行该线程上的循环。
可在此处找到多线程示例:http://howtostartprogramming.com/vb-net/vb-net-tutorial-53-multithreading/
这里有几个选项。两者都在 UI 线程之外有处理代码 运行。第一个按照您的建议使用 Thread
,但使用语法来帮助您前进。调用 Thread.Start
后代码继续执行。第二个使用 Async/Await
,它不会创建额外的线程,但仍会取消 UI 的处理。这是一种更现代的方法。两者都应该为你工作。这不是使用您的确切代码,而是在 10 秒内计数为 100。
Private escPress As Boolean = False
Private Sub RunThreadButton_Click(sender As Object, ea As EventArgs) Handles runThreadButton.Click
Dim p As New Point()
Dim thread2 = New System.Threading.Thread(Sub() checkColor(p))
thread2.Start()
End Sub
Private Async Sub AsyncButton_Click(sender As Object, e As EventArgs) Handles asyncButton.Click
Dim p As New Point()
Await Task.Factory.StartNew(Sub() checkColor(p))
End Sub
Private Sub EscapeButton_Click(sender As Object, e As EventArgs) Handles escapeButton.Click
escPress = True
End Sub
Private Sub checkColor(e As Point)
Try
For x = 0 To 9
If escPress Then Exit For
For y = 0 To 9
If escPress Then Exit For
Threading.Thread.Sleep(100)
Console.WriteLine(y + 10 * x + 1)
Next
Next
Finally
escPress = False
End Try
End Sub
好像是条件
If e.X >= 0 And e.Y >= 0 And (e.X < PictureBox1.Width) And (e.Y < PictureBox1.Height) Then
是不必要的,因为它永远不会改变,除非 PictureBox 宽度在循环中改变。这可以在循环之前检查一次,或者可以在调用 checkColor
之前检查,因为您正在与 UI 交互,所以应该在调用 checkColor
之前检查,为什么要进行无意义的调用?
我正在使用 vb.net 进行编码。该程序遍历图片框中的每个像素,检查并比较用户选择的颜色。当用户按下键盘上的 ESC 按钮时,我编写了一个代码来停止循环。但是看起来当按下 esc 时程序并没有停止。
我制作了一个在按下 esc 按钮时弹出的消息框。当循环为 运行 并且我按下 esc 按钮时,仅当整个循环完成时才会弹出消息框。
For x = rect.X To endPointX - 1 Step pixelStep
For y = endpointY - 1 To rect.Y Step -1
If e.X >= 0 And e.Y >= 0 And (e.X < PictureBox1.Width) And (e.Y < PictureBox1.Height) Then
If escPress Then
Exit For
End If
If bmp.GetPixel(x, y) = cor Then
cruzNoBitmap(PictureBox1, n, pemSize, x, y)
addRow(x, y)
Exit For
End If
End If
Next
If escPress Then
Exit For
End If
Next
Private Sub frmBitmaps_KeyDown(sender As Object, e As System.Windows.Forms.KeyEventArgs) Handles Me.KeyDown
If e.KeyCode = Keys.Escape Then
MsgBox("test")
escPress = True
End If
End Sub
如有帮助,我将不胜感激。
因为你有一个单线程,按钮函数在循环结束之前不会触发。
您可以通过使 x 和 y 成为全局整数并将它们显示在消息框中来确认这一点。
如果您希望能够退出,则需要创建第二个线程,并运行该线程上的循环。
可在此处找到多线程示例:http://howtostartprogramming.com/vb-net/vb-net-tutorial-53-multithreading/
这里有几个选项。两者都在 UI 线程之外有处理代码 运行。第一个按照您的建议使用 Thread
,但使用语法来帮助您前进。调用 Thread.Start
后代码继续执行。第二个使用 Async/Await
,它不会创建额外的线程,但仍会取消 UI 的处理。这是一种更现代的方法。两者都应该为你工作。这不是使用您的确切代码,而是在 10 秒内计数为 100。
Private escPress As Boolean = False
Private Sub RunThreadButton_Click(sender As Object, ea As EventArgs) Handles runThreadButton.Click
Dim p As New Point()
Dim thread2 = New System.Threading.Thread(Sub() checkColor(p))
thread2.Start()
End Sub
Private Async Sub AsyncButton_Click(sender As Object, e As EventArgs) Handles asyncButton.Click
Dim p As New Point()
Await Task.Factory.StartNew(Sub() checkColor(p))
End Sub
Private Sub EscapeButton_Click(sender As Object, e As EventArgs) Handles escapeButton.Click
escPress = True
End Sub
Private Sub checkColor(e As Point)
Try
For x = 0 To 9
If escPress Then Exit For
For y = 0 To 9
If escPress Then Exit For
Threading.Thread.Sleep(100)
Console.WriteLine(y + 10 * x + 1)
Next
Next
Finally
escPress = False
End Try
End Sub
好像是条件
If e.X >= 0 And e.Y >= 0 And (e.X < PictureBox1.Width) And (e.Y < PictureBox1.Height) Then
是不必要的,因为它永远不会改变,除非 PictureBox 宽度在循环中改变。这可以在循环之前检查一次,或者可以在调用 checkColor
之前检查,因为您正在与 UI 交互,所以应该在调用 checkColor
之前检查,为什么要进行无意义的调用?