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