На этом шаге мы рассмотрим управляемые событиями приложения.
В большинстве приложений текстового режима MS-DOS последовательность действий определяется разработчиком во время выполнения программы. Такие DOS-приложения, имея очень небольшое взаимодействие с другими приложениями и отсутствие вмешательства операционной системы, часто основаны на статических принципах проектирования.
Современные же GUI-системы (Graphical User Interface, графический интерфейс пользователя) организованы намного динамичнее. Операционная система, кроме обеспечения уровня сервиса, активно вовлечена в процесс выполнения всех приложений. Приложение взаимодействует с пользователем косвенно через операционную систему. Когда пользователь делает что-либо (нажимает клавишу, перемещает мышь, щелкает на пиктограмме и т. д.), интерфейс аппаратного обеспечения генерирует событие, операционная система переводит это событие в стандартизированный формат сообщения и посылает уведомительное сообщение вызвавшему его элементу. Обычно это окно, которое является активным.
События могут достигать приложения асинхронно, поэтому приложение должно быть написано так, чтобы обеспечить целостность всех данных и процессов независимо от последовательности событий. Приложения, основанные на графическом пользователя, должны реагировать на свое окружение и не могут имитировать стандартное поведение приложений DOS. Приложения позади неактивных окон могут оставаться активными, могут писать или рисовать в своих неактивных окнах, и все это будет отображаться, если окно не закрыто или не перекрыто другим. Приложение может в любое время активизировать одно из своих окон, чтобы запросить входные данные. Активное на этот момент окно становится неактивным, но его приложение продолжает работать.
Вообще, во время работы могут возникать самые разные ситуации, например, пользователь может получить срочный телефонный звонок. На него можно ответить, выбрав системную кнопку окна Task или меню файла и закрыв приложение. Операционная система сообщает приложению о событии, посылая сообщение обработчику событий окна Task. В большинстве многозадачных системах операционная система может приостановить ваше приложение в любое время. Приложение никогда не будет знать, запрашивал ли пользователь закрытие или это операционная система обнаружила сбой питания. Или если приложение хочет закрыть какое-то окно, то оно посылает этому окну запрос на закрытие CloseRequest точно так же, как пользователь, когда он выбирает команду Close в меню окна Task.
Конечно, вы можете уменьшить количество возможных событий и сообщений, блокируя пункты меню и кнопки управления. Часть обработки сообщений GUI-приложений может быть очень сложной, но это - цена за большую гибкость. Пролог и VPI существенно упрощают работу программиста по связыванию приложения с GUI операционной системы. Эксперт кода и браузер (The Code Expert and the Browser) облегчают поиск и обработку кода, который соответствует определенному событию, отвечая на определенное сообщение, и вы редко будете иметь дело с запутанными деталями основной логики передачи сообщений.
На следующем шаге мы рассмотрим запуск VIP.