Подтвердить что ты не робот

Разница между обработчиками событий и обратными вызовами

В чем разница между обработчиком события и функцией обратного вызова?

4b9b3361

Ответ 1

Вообще говоря, "обратный вызов" находится под контролем процесса обнаружения. Таким образом, вы говорите менеджеру GUI "вызывать myaction при нажатии этой кнопки", а менеджер GUI вызывает действие при нажатии кнопки.

С другой стороны, обработчики событий работают за один шаг. Диспетчер графического интерфейса пользователя настроен на отправку сообщений обработчику событий. Вы сообщаете менеджеру событий, что нажатия кнопок обрабатываются программой myaction. Когда кнопка нажата, менеджер GUI помещает сообщение в очередь обработчика событий и начинает управление GUI. Обработчик событий получает сообщение из очереди, видит его нажатием кнопки, запускает программу myaction и переходит к обработке следующего события. Обычно программа myaction запускается как независимый поток или даже как отдельный процесс.

Хотя шаблон "обработчик событий" является более сложным, он гораздо более устойчив и менее подвержен зависанию при сбое действия. Это также делает для более отзывчивого GUI.

Ответ 2

Обратный вызов - это процедура, которую вы передаете в качестве аргумента другой процедуре. Процедура, получающая этот параметр, может вызвать его или поделиться им, чтобы некоторые другие процедуры в системе могли вызвать его.

Обработчик событий - это процедура, вызываемая при возникновении события. Это может быть обратный вызов.

Ответ 3

Обработчик событий - это тип обратного вызова. Он вызывается всякий раз, когда происходит событие. Этот термин обычно используется в терминах пользовательских интерфейсов, где события - это такие вещи, как перемещение мыши, щелчок и т.д.

Ответ 4

Обратный вызов (из Википедии): "исполняемый код, который передается как аргумент другому коду".
Обработчик событий (снова из Википедии): "асинхронная функция обратного вызова, которая обрабатывает входы, полученные в программе".

Который случается так, как я всегда это понимал: обработчик событий - это очень специфический тип обратного вызова.

Ответ 5

Этот вопрос очень старый, но я нашел эту ссылку из MSDN очень интересной. Я надеюсь, что кто-то еще, кто споткнется на этот вопрос, получит что-то из этой ссылки.

Ответ 6

События. Думайте о сервере (работнике) и клиенте (босс). У одного сотрудника может быть много боссов. Сотрудник Поднимает мероприятие, когда он заканчивает задачу, и боссы могут принять решение о прослушивании события Employee или нет. Сотрудник является издателем, а боссы - подписчиком.

Обратный вызов. Босс специально попросил сотрудника выполнить задание, и в конце выполненной задачи Босс хочет получить уведомление. Сотрудник будет убедиться, что когда задача будет выполнена, он уведомляет только босса, который просил, а не всех всех боссов. Сотрудник не будет уведомлять Босса, если выполняется частичная работа. Это будет только после того, как все будет сделано. Только один босс запросил информацию, а сотрудник только отправил ответ одному боссу.

Ответ 7

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

Когда происходит событие, вам сообщают, что что-то произошло. Когда обратный вызов используется, вас просят участвовать в чем-то.

Библиотека или инфраструктура могут выдавать события, которые позволяют вам знать, что что-то произошло. Структура предлагает вам точки, в которые вы можете подключить код (возможно, как обратные вызовы), чтобы вы могли активно участвовать в процессе.

Частью проблемы является то, что событие, обратный вызов относится к техническим метханизму, а также к более абстрактным процессам.

Ответ 8

Ответ Джеймса Андерсона наиболее подробный. Расширение его ответа; Обратный вызов относится к любому коду, который передается в качестве аргумента методу, который должен быть вызван позднее асинхронно. Однако обратный вызов не определяет, как должен выполняться сам процесс обратного вызова. Здесь начинается классификация обратных вызовов. Традиционно процесс обратного вызова будет выглядеть:

  • разработчик определяет обратный вызов и передает его на определенную библиотеку функцию (тот, который знает, что делать с обратным вызовом, чтобы вызывающий процесс или процесс обнаружения мог вызвать его), например. в node,

var server = require('http').createServer(function(req, res){/* your code */});

createServer - это функция, определенная библиотекой, которая гарантирует, что процесс обнаружения получит возможность вызвать правильный обратный вызов, который в этом случае равен function(req, res){/* your code */}

  • во время выполнения процесс обнаружения получает прямое местоположение обратного вызова (потому что функция, определенная библиотекой, сделала это для вас) и вызывает его. Это означало бы 2 вещи:
    • разработчики библиотеки всегда должны знать, как обращаться с различными процессами обнаружения, поскольку каждый из них может иметь другой способ вызова
    • и если обратный вызов нужно вызвать несколько раз, это может спровоцировать процесс обнаружения. Напр. если процесс обнаружения является графическим интерфейсом, то вы хотите, чтобы поток графического интерфейса выполнялся с максимально возможной задачей, для обеспечения плавного графического интерфейса.

Таким образом, возникла необходимость в реализации механизма обратного вызова, который решил эти 2 проблемы:

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

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

  • Приведенный выше код node js является одноразовым событием (поскольку соединение с сервером для клиента является одноразовым событием, тогда как может быть много ответов, которые реализованы как обработчики событий) и является примером простой обратный вызов.

Ответ 9

Основные механизмы аналогичны, но семантика отличается. Оба обратных вызова и обработчики событий называются асинхронно.

Функция обратного вызова обычно передается явно из процедуры вызова, чтобы запросить некоторую информацию. Информация возвращается спустя некоторое время, переданная в качестве аргументов обратно к обратному вызову вызываемого абонента. В это время процедура вызова завершает свой бизнес. Часто обратный вызов является закрытием - синтаксически внутри вызывающей подпрограммы и часто неименованным (анонимным). Это может выглядеть немного как в javascript:

function caller() {
    someLibrary.getMeSomething(arg1, arg2, function(returnedData) {
        // this is the callback which will do something with returnedData
    });
}

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

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

Итак, в Python это может выглядеть так:

class MyUIClass:

    def __init__(self):
        someUILib.register(someUILib.events.MOUSE_CLICK, self.my_mouse_click_handler);

    def my_mouse_click_handler(self, eventInfo):
        # do something with event
        if eventInfo.x < 100:
             print 'You clicked in the margin'

Ответ 10

Мне нравится, как все эти ответы отличаются друг от друга.

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

Ответ 11

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

Обработчик события - это функция (метод), вызываемая при возникновении события. Это может быть обратный звонок.

Ответ 12

Обработчик событий - это обратный вызов из системы.