2010-01-15 12 views

Respuesta

10

En general, una 'devolución de llamada' está bajo el control del proceso de detección. Entonces le dice a un administrador de GUI "llame al myaction cuando se presione este botón" y el administrador de la GUI llama la acción cuando se presiona el botón.

Los manejadores de eventos, por otro lado, funcionan a un paso. El administrador de GUI está configurado para enviar mensajes a un controlador de eventos. Le dice a un administrador de eventos que las pulsaciones de los botones son manejadas por el programa myaction. Cuando se presiona el botón, el administrador de GUI pone un mensaje en la cola de controladores de eventos y se inicia con la administración de GUI, el controlador de eventos recoge el mensaje de la cola, ve que se pulsa un botón, activa el programa myaction y pasa a manejando el próximo evento Por lo general, el programa myaction se ejecutará como un hilo independiente o incluso como un proceso separado.

Si bien el patrón "controlador de eventos" es más complejo, es mucho más robusto y menos probable que se bloquee cuando falla una acción. También hace una GUI más receptiva.

+0

Esta respuesta debe marcarse como Aceptada. –

26

Un controlador de eventos es un tipo de devolución de llamada. Se invoca cada vez que ocurre un evento. El término se usa generalmente en términos de interfaces de usuario donde los eventos son cosas como mover el mouse, hacer clic en algo, etc.

+5

Entonces, hay otros escenarios en los que se puede llamar una devolución de llamada? ¿Aparte de los eventos? ¿Puedes dar ejemplo de una de esas situaciones? –

+2

@cletus, me gustó su respuesta, pero podría agregar algunos ejemplos de lo que es un controlador de eventos y lo que es la devolución de llamada. Entiendo lo que dijiste ... pero siempre ocurre una devolución de llamada porque "sucede algo", sucede que algo ocurre 99,999999% (para mi humilde reconocimiento) como un evento, no usaría otra palabra, y por lo tanto, otro significado. .. y allí antes de concluir que técnicamente hablando son lo MISMO. Por favor, ayúdame a mejorar mi reconocimiento. ¡¡Gracias!! ¡Saludos! :). Intente pensar de esta manera ... ¿Podría enumerar otros tipos de devolución de llamada que no pertenecen a un evento específico? – Victor

36

Una devolución de llamada es un procedimiento que pasa como argumento a otro procedimiento. El procedimiento que recibe el parámetro puede llamarlo o compartirlo para que otros procedimientos en el sistema puedan llamarlo.

Un controlador de eventos es un procedimiento llamado cuando ocurre un evento. Puede ser una devolución de llamada.

-3

El controlador de eventos es una devolución de llamada del sistema.

0

Me encanta cómo todas estas respuestas difieren entre sí.

Debo concluir que, desde el punto de vista de la terminología, los eventos y las devoluciones de llamada son intercambiables. Lo que significan en un lenguaje de programación específico o marco y difieren, porque cualquier plataforma tiende a elegir sus términos favoritos.

+0

No intercambiable; más bien, un controlador de eventos es un tipo de devolución de llamada.Es cierto, sin embargo, que las personas algunas veces usan un tipo muy específico de una cosa para referirse al tipo general. Un Kleenex es un pañuelo de papel, pero no diría que puede usar las palabras indistintamente, ¿verdad? –

+0

Entonces, por favor, Esteban nos aclara con ejemplos concretos de devoluciones de llamadas que no son controladores de eventos. En mi opinión, técnicamente hablando, en el aspecto semántico básico variado, es lo mismo. Gracias y saludos :). – Victor

8

Devolución de llamada (de Wikipedia): "código ejecutable que se pasa como argumento a otro código".
Controlador de eventos (nuevamente de Wikipedia): "subrutina de devolución de llamada asincrónica que maneja las entradas recibidas en un programa".

Cuál es la manera en que siempre lo he entendido: un controlador de eventos es un tipo muy específico de devolución de llamada.

9

Esta pregunta es muy antigua pero encontré este enlace desde MSDN muy interesante. Espero que cualquier persona que tropiece con esta pregunta saque algo de este enlace.

+1

Excelente enlace. Gracias. – Tilak

+2

Interesante. Parafraseando el artículo: un evento es como un tweet; cualquiera puede leer y responder. Mientras que una devolución de llamada es como un mensaje de texto; solo la (s) persona (s) a quien lo envía pueden leerlo y responderlo. – shawnhcorey

1

La respuesta de James Anderson es la más detallada. Ampliando su respuesta; La devolución de llamada se refiere a cualquier código, que se pasa como un argumento a un método, destinado a ser llamado más tarde de forma asíncrona. Sin embargo, una devolución de llamada no define cómo se debe implementar el proceso de devolución de llamada. Aquí es donde comienza la clasificación de las devoluciones de llamada. Tradicionalmente, un proceso de devolución de llamada se vería:

  • el desarrollador define una devolución de llamada y lo pasa a una función definida biblioteca (una que sabe qué hacer con la devolución de llamada para que el proceso de llamada o el proceso de detección pueden llamarlo) por ejemplo en el nodo,

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

la createServer es la función definida biblioteca que hace que el proceso de detección llega a llamar a la devolución de llamada correcta, que en este caso es function(req, res){/* your code */}

  • en tiempo de ejecución, la el proceso de detección recibe la ubicación directa de la devolución de llamada (porque la función definida por la biblioteca lo hizo por usted) y la llama. Esto significaría 2 cosas:
    • los desarrolladores de la biblioteca haría siempre necesita saber cómo hacer frente a diferentes procesos de detección que cada uno puede tener una forma diferente de volver a llamar
    • y si la devolución de llamada tiene que ser llamado varias veces , podría ser una tarea del proceso de detección. Por ej. si el proceso de detección es un proceso de GUI, entonces desearía que el subproceso de la GUI se ejecutara con la menor cantidad de tareas posible, para una experiencia de GUI fluida.

Así dio como resultado la necesidad de implementar un mecanismo de devolución de llamada, que resuelve estos 2 números:

  • un proceso externo que definiría un punto concurrente para la función de biblioteca para registrar las devoluciones de llamada y para el proceso de detección para notificar cuándo deben llamarse estas devoluciones de llamada registradas.
    • Esto significaba que los desarrolladores de estos dos procesos ahora pueden trabajar independientemente el uno del otro, sin conocer realmente las formas de los demás.
    • Este proceso externo pasó a conocerse como bucle de evento (en nodo, por ejemplo). El término 'evento' es simplemente el proceso de notificación del bucle de evento por el proceso de detección y la devolución de llamada registrada se conoce como el controlador de eventos.
  • el proceso externo (o el bucle de eventos) puso en cola los eventos y los ejecutó, quitando así la carga del proceso de detección que ahora podría reanudarse a lo que estaba haciendo mejor.

Así, por hechos ocurridos en múltiples ocasiones, el bucle de eventos o los controladores de eventos se convirtieron en la forma de devoluciones de llamada de ejecución, mientras que las devoluciones de llamada originales todavía son los preferidos para eventos únicos medida que en realidad no son tareas a la vez el medio detector proceso y no necesita tener el bucle de evento para un solo evento ya que no es eficiente.

  • código El nodo js anterior es un evento de una sola vez (como la conexión con el servidor para un cliente es un evento de una sola vez, mientras que puede haber muchas respuestas que se implementan como controladores de eventos) y es un ejemplo de devolución de llamada simple.
0

Los mecanismos subyacentes son similares, pero la semántica es diferente. Tanto las devoluciones de llamada como los controladores de eventos se llaman asincrónicamente.

La función de devolución de llamada generalmente se pasa explícitamente desde una rutina de llamada para solicitar cierta información. La información se devuelve algún tiempo después, pasado como argumentos de regreso a la devolución de llamada por el destinatario. En este momento, la rutina de llamada completa su negocio. A menudo, la devolución de llamada es un cierre, sintácticamente dentro de la rutina de llamada y, a menudo, sin nombre (anónimo). Puede parecer un poco como el siguiente, en javascript:

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

Así que el destinatario de la llamada (someLibrary.getMeSomething) se da una función de devolución de llamada anónima, y ​​algún tiempo después esta función se llama con el returnedData. Una devolución de llamada es como un evento de disparo único para un solo receptor.

Los controladores de eventos también se 'devuelven', pero generalmente se usan durante un período prolongado para múltiples eventos, como clics del mouse, eventos de red, etc. Además, puede haber varios objetos interesados ​​en el mismo evento. Por estas razones, generalmente se 'suscribe' o 'registra' a eventos en el código de configuración (como la inicialización de objetos), y el controlador de eventos es más típicamente un método con nombre. Por lo general, también, cada tipo de evento se identifica como una constante o cadena.

Así que en Python puede ser que parezca:

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' 
3

Otro aspecto de esto es que los eventos describen algo que sucedió en el pasado, mientras que una devolución de llamada se utiliza a menudo cuando algo está pasando.

Cuando se produce un evento, le dicen que algo ha sucedido. Cuando se usa una devolución de llamada, se le pide que participe en algo.

Una biblioteca o marco puede emitir eventos que le permitan saber que algo ha sucedido. Un marco le ofrece puntos en los que puede enchufar el código (tal vez como devoluciones de llamada) para que pueda participar activamente en un proceso.

Parte del problema es ese evento, la devolución de llamada hace referencia a los mecanismos técnicos así como a procesos más abstractos.

+0

Considero que esta es la mejor respuesta. –

7

Eventos - Piense en un Servidor (Empleado) y Cliente (Jefe) .Un Empleado puede tener muchos Jefes. El empleado plantea el evento, cuando termina la tarea, y los jefes pueden decidir escuchar el evento del empleado o no. El empleado es el editor y los jefes son suscriptores.

Devolución de llamada - El jefe le pidió específicamente al empleado que hiciera una tarea y al final de la tarea, el jefe quiere que se le notifique. El empleado se asegurará de que cuando la tarea finalice, notifique solo al Jefe que lo solicitó, no necesariamente a todos los Jefes. El empleado no notificará al jefe, si el trabajo parcial está hecho. Solo será después de que la tarea esté completa. Solo un jefe solicitó la información y el empleado solo envió la respuesta a un jefe.

Cuestiones relacionadas