Вот пара вариантов. У обоих код обработки запускается из потока пользовательского интерфейса. Первый использует Thread
, как вы предложили, но с синтаксисом, чтобы начать работу. Выполнение кода продолжается после вызова Thread.Start
. Второй использует Async/Await
, который не создает дополнительный поток, но все же снимает обработку с пользовательского интерфейса. Это более современный подход. Оба должны работать на вас. Вместо того, чтобы использовать ваш точный код, это всего лишь 100 в течение 10 секунд.
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
, где это должно быть сделано, так как вы взаимодействуете с пользовательским интерфейсом, и зачем делать бессмысленный вызов напрасно?