Потоки и DoEvents
Создайте проект с двумя кнопками. В обработчик нажатия каждой кнопки поместите бесконечный цикл печати чисел: 1 2 3 4 … Вот код:
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim i As Integer = 1
Do
Debug.WriteLine("Работает 1 кнопка:" & i)
i += 1
Loop
End Sub
Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
Dim i As Integer = 1
Do
Debug.WriteLine("Работает 2 кнопка:" & i)
i += 1
Loop
End Sub
Запустите проект. Щелкните по первой кнопке. В окне Output побегут числа. Попробуйте теперь нажать вторую кнопку – у вас просто не получится. Пока процедура не выполнилась, ни форма, ни элементы управления не реагируют на ваши действия. И не только на ваши действия нет реакции, никакая часть кода проекта не работает. Таков известный нам до сих пор закон VB – когда процедура выполняется, все остальные части проекта – «в обмороке».
Завершите проект кнопкой Stop Debugging (квадратик на панели Debug)
Такое положение вещей начинает нам досаждать, когда мы хотим в пределах одного приложения Windows одновременно заниматься несколькими делами. Например, мы создали многодокументный текстовый редактор и хотим, пока в одно окно из файла загружается длинный документ, в другом окне работать с другим документом. Но пока не завершилась процедура открытия и считывания файла, вы не сможете выполнять процедуры, нужные для работы с другим документом. Или, например, в одном окне приложения компьютер обдумывает шахматный ход, а в другом окне этого приложения вы играете в Тетрис. Вы же не хотите, чтобы, пока вы играете в Тетрис, компьютер перестал думать над шахматным ходом.
Бороться с таким положением вещей можно несколькими способами. Первый и самый очевидный – стараться не делать процедур, которые выполняются слишком долго. Второй – умело использовать таймеры, чтобы каждая из соперничающих работ в программе по очереди получала свой справедливый маленький отрезок времени.
Но не всегда это удается и уж никогда не удается без дополнительных хлопот. Однако, есть два инструмента, которые помогут вам избежать этих хлопот. Первый – метод DoEvents, он действует частично. Во втором случае применяем так называемые потоки, этот инструмент действует радикально.