退出2,按esc按钮循环

问题描述 投票:0回答:2

我正在使用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

任何帮助,我都会感激不尽。

vb.net for-loop exit
2个回答
1
投票

由于您具有single线程,因此直到循环结束,按钮功能才会触发。

您可以通过使x和y为全局整数并在消息框中显示它们来确认这一点。

如果您希望能够退出,则需要创建第二个线程,并在该线程上运行循环。

可在此处找到多线程示例:http://howtostartprogramming.com/vb-net/vb-net-tutorial-53-multithreading/


1
投票

这里有几个选择。两者都具有从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交互,因此应该在此处进行检查,为什么不进行无意义的调用?

© www.soinside.com 2019 - 2024. All rights reserved.