ПОНЯТНО О Visual Basic NET (том 3)

       

Потоки и 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, он действует частично. Во втором случае применяем так называемые потоки, этот инструмент действует радикально.



Содержание раздела