В целом, как работают обработчики событий?

14

Это общая тема, как работают обработчики событий?

Это означает, что за кулисами - что происходит, когда они создаются.

У меня есть грубая идея, но я хотел бы, чтобы она была подтверждена.

JHarley1
источник
3
en.wikipedia.org/wiki/Observer_pattern
Стивен Эверс
Блестящий, образец Обозревателя был тем, что я нашел: я прочитал в Интернете об этой проблеме и прочитал хорошую статью на предмет Программирования, управляемого событиями. В этой статье обсуждается процесс шаблона проектирования обработчиков. Таким образом, у вас есть пара событий, которые приходят к диспетчеру, который затем берет это событие и анализирует его, чтобы определить его тип события, а затем отправляет каждое событие обработчику, который может обрабатывать события этого типа.
JHarley1
1
Это объясняет, как диспетчер представляет собой бесконечный цикл, который останавливается только тогда, когда (например, с GUI-приложением) программа закрывается. И затем, как у вас есть шаблон наблюдателя (или шаблон публикации / подписки), который широко используется для программирования на основе событий с помощью графических фреймворков, и как он работает по голливудскому принципу «Не звоните нам, мы вам позвоним» ,
JHarley1
Вы сказали бы, что приведенное выше объяснение адекватно?
JHarley1
По-разному. Для обзора высокого уровня это хорошо. Однако, для всестороннего и полного объяснения, черт возьми, нет. Конечно, такое объяснение, вероятно, будет состоять из множества страниц работы, так как это может быть довольно причудливо, как, например, вы могли бы заняться веб-событиями против рабочего стола.
JB King

Ответы:

15

На низком уровне обработчики событий часто работают, опрашивая устройство и ожидая аппаратного прерывания. По сути, фоновый поток блокируется во время ожидания аппаратного прерывания. Когда происходит прерывание, функция опроса прекращает блокировку. Затем приложение может выяснить, какой дескриптор устройства вызвал прерывание и каким типом прерывания оно было, и затем действовать соответствующим образом (например, вызывая функцию обработчика события). Обычно это делается в отдельном потоке, так что это происходит асинхронно.

Конечно, способ, которым это на самом деле реализовано, значительно варьируется в зависимости от ОС и типа устройства / ввода. В системах UNIX одним из способов реализации обработчиков событий для таких вещей, как сокеты, последовательные порты или порты USB, является использование системных вызовов select или poll . Один или несколько дескрипторов файлов / устройств (которые связаны с устройством, таким как сетевой сокет, последовательный порт / USB-порт и т. Д.) Передаются pollсистемному вызову, который доступен программисту через низкоуровневый C-API. Когда событие происходит на одном из этих устройств (например, некоторые данные поступают на последовательный порт), системный вызов poll прекращает блокировку, и приложение затем может определить, какой дескриптор устройства вызвал событие, и какой тип события это было ,

В Windows это обрабатывается по-разному, но концепции в основном одинаковы.

Чарльз Сальвия
источник