我正在使用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
任何帮助,我都会感激不尽。
由于您具有single线程,因此直到循环结束,按钮功能才会触发。
您可以通过使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交互,因此应该在此处进行检查,为什么不进行无意义的调用?