В компьютерном программировании событийно -ориентированное программирование — это парадигма программирования , в которой ход выполнения программы определяется внешними событиями . Типичным событием могут быть события пользовательского интерфейса от мышей , клавиатур , сенсорных панелей и сенсорных экранов или входные данные от внешних датчиков , а также быть сгенерированы программно ( передача сообщений ) из других программ или потоков или сетевых событий.
Программирование, управляемое событиями, является доминирующей парадигмой, используемой в приложениях с графическими пользовательскими интерфейсами и сетевых серверах.
В приложении, управляемом событиями, обычно существует цикл событий , который прослушивает события, а затем запускает функцию обратного вызова при обнаружении одного из этих событий.
Программы, управляемые событиями, можно писать на любом языке программирования , хотя эта задача проще в языках, предоставляющих абстракции высокого уровня .
Хотя они не совсем соответствуют модели, управляемой событиями, обработка прерываний и обработка исключений имеют много общего.
Поскольку цикл получения/отправки событий является общим для приложений, многие среды программирования заботятся об их реализации и ожидают, что пользователь предоставит только код для обработчиков событий.
RPG , ранний язык программирования от IBM , чья концепция дизайна 1960-х годов была похожа на программирование, управляемое событиями, обсуждавшееся выше, предоставлял встроенный основной цикл ввода-вывода (известный как «программный цикл»), в котором вычисления выполнялись в соответствии с «программным циклом». индикаторы ( флаги ), которые были установлены ранее в цикле.
Фактическая логика содержится в процедурах обработчика событий. Эти процедуры обрабатывают события, на которые будет реагировать основная программа. Например, один щелчок левой кнопкой мыши по командной кнопке в программе с графическим пользовательским интерфейсом может запустить процедуру, которая откроет другое окно, сохранит данные в базе данных или выйдет из приложения. Многие IDE предоставляют программисту шаблоны событий графического интерфейса, позволяя программисту сосредоточиться на написании кода события.
Хотя отслеживание истории обычно тривиально в последовательной программе. Поскольку обработчики событий выполняются в ответ на внешние события, правильное структурирование обработчиков для работы при вызове в любом порядке может потребовать особого внимания и планирования в программе, управляемой событиями.
Помимо написания обработчиков событий, обработчики событий также необходимо привязать к событиям, чтобы при возникновении события вызывалась правильная функция. Для событий пользовательского интерфейса многие IDE объединяют два шага: двойной щелчок по кнопке, и редактор создает (пустой) обработчик событий, связанный с нажатием кнопки пользователем, и открывает текстовое окно, чтобы вы могли редактировать обработчик событий.
Большинство существующих архитектур графического пользовательского интерфейса используют программирование, управляемое событиями. [1] В Windows есть цикл событий . Платформа Java AWT обрабатывает все изменения пользовательского интерфейса в одном потоке, называемом потоком диспетчеризации событий . Аналогично, все обновления пользовательского интерфейса в платформе Java JavaFX происходят в потоке приложения JavaFX. [2]
Большинство сетевых серверов и платформ, таких как Node.js, также управляются событиями. [3]
Дизайн этих программ, которые полагаются на модель событийного действия, подвергся критике, и было высказано предположение, что модель событийного действия заставляет программистов создавать подверженный ошибкам, трудно расширяемый и чрезмерно сложный код приложения. [1] В качестве жизнеспособной альтернативы пропагандируются управляемые таблицами конечные автоматы . [4] С другой стороны, конечные автоматы с табличным управлением сами по себе страдают существенными недостатками, включая феномен взрыва состояний . [5] Решением этой проблемы является использование сетей Петри .
Граф сцены JavaFX, который представляет графический пользовательский интерфейс приложения JavaFX, не является потокобезопасным, и к нему можно получить доступ и изменить его только из потока пользовательского интерфейса, также известного как поток приложения JavaFX.