терминология
событие : тип вещей, которые могут произойти.
запуск события : конкретное возникновение события; событие происходит.
слушатель события : что-то, что высматривает события.
обработчик события : то, что происходит, когда слушатель события обнаруживает срабатывание события.
подписчик события : ответ, который должен вызвать обработчик события.
Эти определения не зависят от реализации, поэтому они могут быть реализованы разными способами.
Некоторые из этих терминов обычно ошибочно принимают за синонимы, поскольку пользователям часто не нужно различать их.
Общие сценарии
Программирование-логика событий.
Событие , когда какой - либо метод вызывается.
Обжиг события является конкретным вызовом к этому методу.
Прослушиватель событий является крюк в методе события , который называется на каждом выстреле событий , который вызывает обработчик события.
Обработчик событий вызывает набор абонентов событий.
Подписчик события (ы) выполнять любые действия (s) система означает , что произойдет в ответ на возникновение события.
Внешние события.
Событие является внешним событием , которое может быть выведено из наблюдаемых.
Стрельбы события , когда , что внешнее событие может быть признаны , имевшее место.
Слушатель события как - то обнаруживает пуски события, часто путем опроса наблюдаемой (s), то он вызывает обработчик события при обнаружении события стрельбы.
Обработчик событий вызывает набор абонентов событий.
Подписчик события (ы) выполнять любые действия (s) система означает , что произойдет в ответ на возникновение события.
Опрос и вставка хуков в механизм запуска события
Дело в том, что опросы часто не нужны. Это связано с тем, что прослушиватели событий могут быть реализованы путем автоматического вызова обработчиков событий, вызывающих обработчик событий, что часто является наиболее эффективным способом реализации вещей, когда события являются событиями системного уровня.
По аналогии, вам не нужно каждый день проверять почтовый ящик на наличие почты, если работник почты стучит в вашу дверь и вручает почту прямо вам.
Однако слушатели событий могут также работать опросом. Опрос не обязательно должен проверять определенное значение или другое наблюдаемое; это может быть более сложным. Но, в целом, смысл опроса заключается в том, чтобы сделать вывод, когда произошло какое-то событие, на которое можно ответить.
По аналогии, вы должны проверять свой почтовый ящик каждый день, когда почтовый работник просто бросает в него почту. Вам не пришлось бы выполнять эту работу по опросу, если бы вы могли проинструктировать почтового работника постучать в вашу дверь, но это часто невозможно.
Логика цепочки событий
Во многих языках программирования вы можете написать событие, которое вызывается только при нажатии клавиши на клавиатуре или в определенное время. Хотя это внешние события, вам не нужно их опрашивать. Почему?
Это потому, что операционная система опрашивает вас. Например, Windows проверяет такие вещи, как изменения состояния клавиатуры, и если она их обнаруживает, она вызывает абонентов событий. Итак, когда вы подписываетесь на событие нажатия клавиатуры, вы фактически подписываетесь на событие, которое само является подписчиком события, которое опрашивает.
По аналогии, скажем, что вы живете в многоквартирном комплексе, и почтовый работник отправляет почту в общую зону приема почты. Затем работник, похожий на операционную систему, может проверить эту почту для всех, доставляя почту в квартиры тех, кто что-то получил. Это избавляет всех остальных от необходимости опроса области получения почты.
Моя интуиция предполагала, что слушатель события постоянно проверяет, было ли событие запущено, а это означает, что в моем сценарии это не отличалось бы от проверки каждого кадра, если событие было запущено.
Судя по обсуждению в классе, слушатель событий работает по-другому.
Как работает слушатель событий?
Как вы и подозревали, событие может работать через опрос. И если событие каким-то образом связано с внешними событиями, например нажатием клавиши клавиатуры, опрос должен произойти в какой-то момент.
Также верно, что события не обязательно должны включать опрос. Например, если событие происходит при нажатии кнопки, то прослушиватель событий этой кнопки - это метод, который может вызвать среда графического интерфейса пользователя, когда он определяет, что нажатие кнопки мыши касается кнопки. В этом случае опрос все еще должен был произойти для обнаружения щелчка мыши, но слушатель мыши - более пассивный элемент, связанный с примитивным механизмом опроса через цепочку событий.
Обновление: на аппаратном опросе низкого уровня
Оказывается, что USB-устройства и другие современные коммуникационные протоколы имеют довольно увлекательный сетевой набор протоколов для взаимодействия, позволяющий устройствам ввода-вывода, включая клавиатуры и мыши, участвовать в специальных топологиях.
Интересно, что « прерывания » являются довольно обязательными, синхронными вещами, поэтому они не обрабатывают специальные сетевые топологии. Чтобы исправить это, « прерывания » были обобщены в асинхронные высокоприоритетные пакеты, называемые « транзакциями прерывания » (в контексте USB) или « прерываниями с сигналом сообщения » (в контексте PCI). Этот протокол описан в спецификации USB:
- « Рисунок 8-31. Конечный автомат хоста транзакции OUT / Управление / Прерывание » в «Спецификации универсальной последовательной шины, редакция 2.0» , print-page-222; PDF-страница-250 (2000-04-27)
Суть в том, что устройства ввода-вывода и коммуникационные компоненты (например, концентраторы USB) в основном действуют как сетевые устройства. Итак, они отправляют сообщения, что требует опроса их портов и тому подобное. Это устраняет необходимость в выделенных аппаратных линиях.
Операционные системы , такие как Windows , кажется, обрабатывать сам процесс опроса, например , как описано в документации MSDN для USB_ENDPOINT_DESCRIPTOR
«с , который описывает , как управлять тем, как часто для Windows опрашивает контроллер USB хост для прерывания / изохронными сообщений:
bInterval
Значение содержит интервал опроса для прерывания и изохронных конечных точек. Для других типов конечных точек это значение следует игнорировать. Это значение отражает конфигурацию устройства в прошивке. Водители не могут изменить это.
Интервал опроса вместе со скоростью устройства и типом хост-контроллера определяют частоту, с которой драйвер должен инициировать прерывание или изохронную передачу. Значение в bInterval
не представляет фиксированное количество времени. Это относительное значение, и фактическая частота опроса также будет зависеть от того, работают ли устройство и хост-контроллер USB на низкой, полной или высокой скорости.
- «Структура USB_ENDPOINT_DESCRIPTOR» , Центр разработки аппаратного обеспечения, Microsoft
Новые протоколы подключения монитора, такие как DisplayPort, похоже, делают то же самое:
Многопотоковый транспорт (MST)
-Слайд № 14 из «Обзор DisplayPortTM Ver.1.2» (2010-12-06)
Эта абстракция допускает некоторые полезные функции, такие как запуск 3 мониторов из одного соединения:
DisplayPort Multi-Stream Transport также позволяет соединять три или более устройств вместе, но в противоположной, менее ориентированной на потребителя конфигурации: одновременное управление несколькими дисплеями из одного выходного порта.
- "DisplayPort" , Википедия
Концептуально, суть в том, что механизмы опроса допускают более обобщенную последовательную связь, что замечательно, когда вам нужна более общая функциональность. Таким образом, аппаратное обеспечение и ОС делают большой опрос для логической системы. Затем потребители, которые подписываются на события, могут наслаждаться теми деталями, которые обрабатываются для них системой более низкого уровня, без необходимости писать свои собственные протоколы опроса / передачи сообщений.
В конечном счете, такие события, как нажатия клавиш, проходят довольно интересную серию событий, прежде чем перейти к обязательному механизму запуска событий на уровне программного обеспечения.