Введение
Парадигма компьютерного программирования
В компьютерном программировании, событийное программирование — это парадигма программирования, в которой ход выполнения программы определяется внешними событиями. Типичными событиями могут быть события пользовательского интерфейса от мыши, клавиатуры, тачпада и сенсорных экранов, или входные данные с внешних датчиков, или события, генерируемые программно (передача сообщений) из других программ или потоков, или сетевые события. Событийное программирование является доминирующей парадигмой, используемой в приложениях с графическим пользовательским интерфейсом и сетевых серверах. В событийном приложении обычно присутствует цикл обработки событий, который отслеживает события и затем вызывает функцию обратного вызова при обнаружении одного из этих событий. Событийные программы могут быть написаны на любом языке программирования, хотя задача упрощается в языках, предоставляющих высокоуровневые абстракции. Обработка прерываний и обработка исключений имеют много общего, хотя они и не полностью соответствуют событийной модели.
In computer programming, event driven programming is a programming paradigm in which the flow of the program is determined by external events. Typical event can be UI events from mice, keyboards, touchpads and touchscreens, or external sensor inputs, or be programmatically generated (message passing) from other programs or threads, or network events. Event driven programming is the dominant paradigm used in graphical user interfaces applications and network servers. In an event driven application, there is generally an event loop that listens for events and then triggers a callback function when one of those events is detected. Event driven programs can be written in any programming language, although the task is easier in languages that provide high level abstractions. Although they do not exactly fit the event driven model, interrupt handling and exception handling have many similarities.
Круг событий
Поскольку цикл обработки и распределения событий является общим для приложений, многие программные фреймворки берут на себя реализацию этого цикла и ожидают от пользователя предоставления только кода для обработчиков событий. RPG, один из ранних языков программирования от IBM, концепция разработки которого в 1960-х годах была схожа с вышеописанным событийно-ориентированным программированием, предоставлял встроенный основной цикл ввода-вывода (известный как "цикл программы"), в котором вычисления реагировали на "индикаторы" (флаги), установленные ранее в этом цикле.
Управляющие событиями
Фактическая логика содержится в подпрограммах обработки событий. Эти подпрограммы обрабатывают события, на которые будет реагировать основная программа. Например, одиночный щелчок левой кнопкой мыши по кнопке в программе с графическим интерфейсом может запустить подпрограмму, которая откроет другое окно, сохранит данные в базу данных или завершит работу приложения. Многие IDE предоставляют программистам шаблоны событий графического интерфейса, позволяя программистам сосредоточиться на написании кода обработки событий. В то время как отслеживание истории обычно является тривиальной задачей в последовательной программе, поскольку обработчики событий выполняются в ответ на внешние события, правильная организация этих обработчиков для корректной работы при вызове в любом порядке может потребовать особого внимания и планирования в событийно-ориентированной программе. Помимо написания обработчиков событий, необходимо также связать их с соответствующими событиями, чтобы при возникновении события вызывалась нужная функция. Для событий пользовательского интерфейса многие IDE объединяют эти два шага: двойной щелчок по кнопке приводит к тому, что редактор создает (пустой) обработчик событий, связанный с нажатием кнопки пользователем, и открывает текстовое окно для редактирования этого обработчика.
Общее применение
Большинство существующих архитектур графических интерфейсов используют событийное программирование. В Windows есть цикл обработки событий. Фреймворк Java AWT обрабатывает все изменения пользовательского интерфейса в одной нити, называемой нитью диспетчеризации событий. Аналогично, все обновления пользовательского интерфейса в JavaFX происходят в нити JavaFX Application Thread. Большинство сетевых серверов и фреймворков, таких как Node.js, также построены на основе событийного подхода.