Функция DoEvents.
Обычно программист ожидает, что
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 реагировать на события в момент
вычислений. Небольшое дополнительное время при
этом с лихвой окупается.