Обычно программист ожидает, что Windows (и Visual Basic) постоянно отслеживает все события и реагирует
на них. С другой стороны, много времени уходит на различного рода вычисления
или сортировку данных. Однако при этом не всегда желательно запрещать приложению
Visual Basic реагировать на события. Если создается процедура, в которой
много времени будет занято различного рода вычислениями, необходим механизм
отслеживания состояния операционной системы и реагирования на различного
рода события.
Функция, выполняющая такого рода задачи, носит
название DoEvents. В каком бы месте программы ни стоял данный оператор,
он сигнализирует Visual Basic о том, что управление передано операционной
системе для обработки всех событий. (Windows сохраняет последовательность
наступления событий в очереди, а также нажатий клавиш в очереди SendKeys.)
DoEvents нельзя использовать в процедуре обработки событий, которая вызывается
несколько раз. Например, процедура обработки событий Click может быть вызвана
еще раз щелчком мыши. Если забыть про это, можно легко организовать в программе
бесконечный цикл.
Цикл, работающий только в
случае отсутствия каких-либо событий, носит наименование цикла ожидания.
Такие циклы создаются внутри специализированной процедуры Sub, носящей
имя Main, и подключающейся к любому программному модулю. В каждом проекте
существует только одна процедура Main. Ее формат следующий:
Sub Main()
Do While DoEvents()
'Код, работающий в процессе цикла ожидания
Loop
End Sub
Далее необходимо сделать так, чтобы
модуль с Main загружался первым. Для этого нужно выбрать в меню пункт Project|Project
Properties и затем страницу General. На этой странице выбрать и открыть
список StartUp Object и выбрать Sub Main вместо формы. После того как процедура
Main указана загрузочной. Visual Basic не будет автоматически загружать
какую-нибудь форму. Для этого теперь необходимо писать программный код,
используя, сервированные слова Load и Show.
Ниже приведен простой пример
цикла ожидания. Необходимо создать новый проект и добавить к нему программный
модуль. Далее в нем объявляется глобальная переменная Counter типа long
integer:
Public Counter As Long
Теперь добавим несколько строк кода к процедуре Main:
Sub Main()
Fonnl.
Show
Do
While DoEventsf)
Counter = Counter + 1
loop
End Sub
В завершение установим Sub Main, как загрузочный модуль, и добавим процедуру Form_Click:
Sub Form_Click()
Print
Counter
End Sub
После запуска такой программы
счетчик будет увеличиваться каждый раз после щелчка внутри формы. Причина
состоит в том, что в течение периода ожидания (когда пользователь не щелкает
мышью) Visual Basic переходит к процедуре Main и добавляет 1 к счетчику.
Поскольку Counter является глобальной переменной, ее значение сохраняется
между вызовами процедуры.
Функция DoEvents на самом
деле возвращает число форм, загруженных приложением в текущий момент. Цикл
ожидания останавливается, когда выгружены все формы. (Или Visual Basic
встречает оператор End.)
Другое общее использование функции DoEvents внутри
функции состоит в запуске больших по времени вычислений. Установка цикла
ожидания позволяет Visual Basic реагировать на события в момент вычислений.
Небольшое дополнительное время при этом с лихвой окупается.