Функція DoEvents

Зазвичай, програміст очікує, що Windows (і Visual Basic) постійно відстежує всі події і реагує на них. З іншого боку, багато часу йде на різноманітні обчислення або сортування даних. Однак при цьому не завжди бажано забороняти програмі Visual Basic реагувати на події. Якщо створюється процедура, в якій багато часу буде зайнято різного роду обчисленнями, необхідний механізм відстеження стану операційної системи та реагування на різноманітні події.

Функція, що виконує такого роду завдання, має назву DoEvents. В якому місці програми не стояв даний оператор, він сигналізує Visual Basic про те, що управління передано операційній системі для обробки всіх подій. (Windows зберігає послідовність наступу подій у черзі, а також натискання клавіш у черзі SendKeys.) DoEvents не можна використовувати в процедурі обробки подій, яка викликається кілька разів. Наприклад, процедура обробки подій Click може бути викликана ще раз клацанням миші. Якщо забути про це, можна легко організувати у програмі нескінченний цикл.

Цикл, що працює тільки у разі відсутності будь-яких подій, має назву циклу очікування. Такі цикли створюються всередині спеціалізованої процедури Sub, що носить ім'я Main, і підключається до будь-якого програмного модуля. У кожному проекті існує лише одна процедура Main. Її формат наступний:

Далі необхідно зробити так, щоб модуль із Main завантажувався першим. Для цього потрібно вибрати в меню пункт ProjectProject Properties, а потім сторінку General. На цій сторінці вибрати та відкрити список StartUp Object та вибрати Sub Main замість форми. Після того, як процедура Main вказана завантажувальною. Visual Basic не буде автоматично завантажуватиякусь форму. Для цього тепер необхідно писати програмний код, використовуючи сервіровані слова Load і Show.

Нижче наведено простий приклад циклу очікування. Необхідно створити новий проект та додати до нього програмний модуль. Далі в ньому оголошується глобальна змінна Counter типу long integer:

Тепер додамо кілька рядків коду до процедури Main:

На завершення встановимо Sub Main як завантажувальний модуль і додамо процедуру Form_Click:

Після запуску такої програми лічильник буде збільшуватися щоразу після натискання всередині форми. Причина полягає в тому, що протягом періоду очікування (коли користувач не клацає мишею) Visual Basic переходить до процедури Main і додає 1 до лічильника. Оскільки Counter є глобальною змінною, значення зберігається між викликами процедури.

Функція DoEvents насправді повертає кількість форм, завантажених програмою в даний момент. Цикл очікування зупиняється, коли вивантажено всі форми. (Або Visual Basic зустрічає оператор End.)

Інше загальне використання функції DoEvents всередині функції полягає у запуску великих за часом обчислень. Установка циклу очікування дозволяє Visual Basic реагувати на події під час обчислень. Невеликий додатковий час при цьому з лишком окупається.