Цикл событийВ информатике, цикл событий [1] [2] [3] , диспетчер сообщений, цикл сообщений, помпа сообщений, или рабочий цикл — программная конструкция, которая ожидает прибытия и производит рассылку событий или сообщений в программе. Он работает, делая запрос к некоторому внутреннему или внешнему «поставщику событий» (который, как правило блокирует запрос до тех пор, пока событие не появится), а затем вызывает соответствующий обработчик события («отправляет событие»). Цикл событий может быть использован в сочетании с паттерном проектирования Reactor, если поставщик событий соответствует файловому интерфейсу, который может быть выбран (имеется в виду методом select) или «опрашивается» (имеется в виду системный вызов Unix, а не фактический опрос). Цикл событий почти всегда работает асинхронно с отправителем. Когда цикл событий образует центральный поток управления, образующий программу, как это часто бывает, такой цикл может быть назван главным циклом или главным циклом событий. Это название подходит потому, что такой цикл событий находится на самом высоком уровне потока управления в рамках программы. Передача сообщенийПомпы сообщений, как говорится, «перекачивают» сообщения в программе из очереди сообщений (привязанной и, как правило, находящейся под управлением операционной системы) для обработки. В строгом смысле цикл событий является одним из методов для реализации связи между процессами. На самом деле обработка сообщений существует во многих системах, в том числе на уровне ядра операционной системы Mach. Цикл событий является специфической техникой реализации систем, использующих передачу сообщений. ИспользованиеТрадиционно программы писались в синхронном стиле: всё взаимодействие с программой сводилось либо к передаче данных через аргументы командной строки, либо через ввод со стороны пользователя. Такой подход оказался не применим для написания программ, использующих графический интерфейс. Для таких программ удобнее использовать асинхронный стиль, где на определённые события вызывается зарегистрированный обработчик (функция). Для реализации такого подхода используется цикл событий. Обычно операционная система предоставляет функцию выборки следующего сообщения (наподобие Цикл событий в псевдокоде: function main initialize() while message != quit message := get_next_message() process_message(message) end while end function Асинхронный подход нашел применение и в сетевом программировании. Например, сервер nginx, работающий асинхронно и использующий неблокирующий ввод-вывод, способен обрабатывать гораздо большее количество соединений, чем его синхронные аналоги, создающие по потоку или процессу на каждого клиента. РеализацииUnixВ Unix парадигма «всё это файл», естественно, приводит к циклу событий, в основе которого лежат события, связанные с файлами. Чтение и запись в файлы, межпроцессное взаимодействие, сети связи и управления устройствами – все это достигается с помощью файлового ввода/вывода, где файлы идентифицируются дескрипторами. Системные вызовы Обработка сигналовОдна из немногих черт Unix, несоответствующих файловому интерфейсу, – это асинхронные события (сигналы). Сигналы, получаемые в обработчике сигнала, – это маленькие, ограниченные фрагменты кода, которые работают в то время, как остальная часть задачи приостановлена. Если сигнал принимается и обрабатывается, и при этом задача заблокирована в Таким образом, очевидный способ обрабатывать сигналы для обработчиков сигналов – это установка глобального флага и включение проверки этого флага в цикл событий непосредственно до и после вызова Решением, к которому пришли в POSIX, является pselect, вызов которого похож на Альтернативное и более переносимое решение заключается в преобразовании асинхронных событий в события на основе файлов, используя пайп-себе трюк,[4], в котором «обработчик сигнала пишет байт в пайп, другой конец которого наблюдается вызовом Microsoft WindowsПомимо неблокирующего ввода-вывода, использующего такие функции мультиплексирования ввода-вывода, как WSAPoll или select, в операционной системе Microsoft Windows предусмотрен и асинхронный ввод-вывод. Для асинхронных операций ввода-вывода существует Overlapped I/O. Если в блокирующие функции, такие как ReadFile() или WriteFile(), передать одним из аргументов структуру Помимо ввода-вывода в Windows реализован цикл событий для графических приложений. «Сердцем» таких приложений является функция WinMain(), которая вызывает GetMessage() в цикле. GetMessage() блокируется, пока не поступит какое-либо событие (также есть неблокирующая альтернатива в виде PeekMessage()). Далее, после небольшой обработки вызывается DispatchMessage(), которая передаёт сообщение о событии надлежащему обработчику, также известному как WindowProc. Сообщения, для которых не зарегистрирован обработчик, передаются обработчику по умолчанию (DefWindowProc) См. также
Примечания
|