La programación dirigida por eventos ( eng. programación dirigida por eventos ; en adelante SOP) es un paradigma de programación en el que la ejecución del programa está determinada por eventos : acciones del usuario (teclado, mouse, pantalla táctil), mensajes de otros programas y subprocesos, eventos del sistema operativo ( por ejemplo, la recepción de un paquete de red ).
SOP también se puede definir como una forma de construir un programa de computadora en el que el bucle principal de la aplicación se asigna explícitamente en el código (generalmente en la función principal del programa) , cuyo cuerpo consta de dos partes: obtención de eventos y procesamiento de eventos. .
Como regla general, en tareas reales, es inaceptable ejecutar un controlador de eventos durante mucho tiempo, ya que en este caso el programa no puede responder a otros eventos. En este sentido, cuando se escriben programas dirigidos por eventos, se suele utilizar la programación automática .
La programación dirigida por eventos se usa generalmente en tres casos:
La programación basada en eventos se utiliza en aplicaciones de servidor para resolver el problema de escalar a 10 000 conexiones simultáneas o más.
En los servidores construidos según el modelo "un hilo por conexión", surgen problemas de escalabilidad por las siguientes razones:
Una premisa filosófica para abandonar el modelo de transmisión de servidores puede ser la declaración de Alan Cox : “Una computadora es una máquina de estado . La programación de flujo es para aquellos que no saben programar máquinas de estado” [1] .
La aplicación de servidor en la programación orientada a eventos se implementa en una llamada al sistema que recibe eventos simultáneamente desde muchos descriptores (multiplexación). El manejo de eventos utiliza exclusivamente operaciones de E/S sin bloqueo para que ningún identificador interfiera con el procesamiento de eventos de otros identificadores.
Las siguientes herramientas del sistema operativo se pueden utilizar para multiplexar conexiones:
En los lenguajes de programación modernos, los eventos y los controladores de eventos son fundamentales para la implementación de una interfaz gráfica de usuario. Considere, por ejemplo, la interacción de un programa con eventos del mouse. Al presionar el botón derecho del mouse, se activa una interrupción del sistema que ejecuta un procedimiento específico dentro del sistema operativo. Este procedimiento busca la ventana debajo del cursor del mouse. Si se encuentra una ventana, este evento se envía a la cola de mensajes de la ventana. Además, según el tipo de ventana, se pueden generar eventos adicionales. Por ejemplo, si una ventana es un botón (en Windows, todos los elementos gráficos son ventanas), se genera adicionalmente un evento de clic de botón. La diferencia del último evento es que es más abstracto, es decir, no contiene las coordenadas del cursor, sino que simplemente dice que se hizo clic en el botón.
Un controlador de eventos podría verse así (usando C# como ejemplo):
privado void button1_Click ( remitente del objeto , EventArgs e ) { MessageBox . Mostrar ( "Se presionó el botón" ); }Aquí, el controlador de eventos es un procedimiento al que se pasa el parámetro del remitente, que normalmente contiene un puntero al origen del evento. Esto le permite usar el mismo procedimiento para manejar eventos de múltiples botones, distinguiéndolos por este parámetro.
En C# , los eventos se implementan como un elemento de lenguaje y son miembros de clases. El mecanismo de eventos aquí implementa el patrón de diseño de publicador/suscriptor . Ejemplo de declaración de evento:
public class MyClass { public event EventHandler MyEvent ; }Donde EventHandler es un delegado que especifica el tipo de procedimiento del controlador de eventos. La suscripción a un evento se realiza de la siguiente manera:
miclase _ MiEvento += nuevo EventHandler ( Manejador );Aquí myClass es una instancia de la clase MyClass , Handler es un procedimiento de controlador. Un evento puede tener un número ilimitado de controladores. Cuando se agrega un controlador de eventos, se agrega a una pila especial y, cuando ocurre un evento, se llama a todos los controladores en su orden en la pila. La cancelación de la suscripción a un evento, es decir, la eliminación de un controlador, se realiza de manera similar, pero utilizando el operador "-=".
Diferentes lenguajes de programación admiten SOP en diversos grados. Los siguientes idiomas tienen el soporte más completo para eventos (lista no exhaustiva):
Otros lenguajes, en su mayor parte, admiten eventos como manejo de excepciones .