Как программные события работают внутри? - PullRequest
1 голос
/ 22 мая 2010

Я учусь на факультете компьютерных наук и узнал многие основные понятия о том, что происходит «под капотом» во время работы компьютерной программы.Но недавно я понял, что не понимаю, как программные события работают эффективно.

В аппаратном обеспечении это легко: вместо того, чтобы процессор «ждал», чтобы увидеть, если что-то произошло, компонент отправляет запрос прерывания.

Но как это работает, например, при наведении курсора мыши?Мое предположение следующее: если мышь посылает сигнал («перемещен»), операционная система вычисляет свою новую позицию p, затем проверяет, какая программа отображается на экране, сообщает эту программную позицию p, затем сама программа проверяет, чтоobject находится в точке p, проверяет, связаны ли какие-либо обработчики событий с указанным объектом, и, наконец, запускает их.

Это звучит для меня ужасно неэффективно, поскольку крошечное движение мыши приравнивается к множеству переключений контекста процессора (которые я узналотносительно дороги).А потом есть десятки фоновых приложений, которые могут захотеть сделать что-то свое.

Где моя интуиция подводит меня?Я понимаю, что даже «медленные» процессоры с тактовой частотой 500 МГц выполняют 500 миллионов операций в секунду, но все же кажется, что это слишком много для такого простого события.

Заранее спасибо!

Ответы [ 4 ]

5 голосов
/ 22 мая 2010

Думайте о событиях как о сетевых пакетах, поскольку они обычно обрабатываются с помощью аналогичных механизмов. Теперь подумайте, ваша мышь посылает максимум пару сотен пакетов в секунду, и они около 6 байт каждый. Это ничто по сравнению с пропускной способностью современных машин.

Фактически, вы могли бы создать отзывчивый графический интерфейс, в котором каждое движение мыши буквально отправляло сетевой пакет (86 байт, включая заголовки) на аппаратном обеспечении, построенном около 20 лет назад: X11, основной механизм графического интерфейса для Linux и большинства других Unix, может выполнять именно так и часто использовалось таким образом в конце 80-х и начале 90-х годов. Когда я впервые использовал графический интерфейс, это было то, чем он был, и, хотя по нынешним меркам он был не очень хорош, учитывая, что он работал на машинах с 20 МГц, он действительно был пригоден для использования.

2 голосов
/ 22 мая 2010

Мое понимание таково:

Каждое приложение / окно имеет цикл обработки событий, который заполняется прерываниями ОС. Движение мыши придет туда. Все окна имеют отдельную очередь / процесс, насколько мне известно (в Windows начиная с версии 3.1)

Каждое окно имеет элементы управления. Окно будет всплывать эти события для элементов управления. Элемент управления определит, является ли событие для него.

Так что нет необходимости «вычислять», какой элемент рисуется под курсором мыши. Окно, а затем элемент управления определит, является ли событие для них.

0 голосов
/ 22 мая 2010

Вы в значительной степени правы - хотя события мыши происходят с фиксированной скоростью (например, USB-мышь в Linux выдает события 125 раз в секунду по умолчанию - что на самом деле не так много), а ОС или приложение могут дальнейшее слияние событий мыши, близких по времени или положению, перед отправкой для обработки

0 голосов
/ 22 мая 2010

По каким критериям вы определяете, что это слишком много? Это столько работы, сколько нужно. События мыши происходят в миллисекундном диапазоне. Работа, необходимая для его передачи в код обработчика, вероятно, измеряется в микросекундах. Это просто не проблема.

...