En la programación de computadoras , la programación impulsada por eventos es un paradigma de programación en el que el flujo del programa está determinado por eventos tales como acciones del usuario ( clics del mouse , pulsaciones de teclas), salidas de sensores o mensajes que pasan de otros programas o subprocesos . La programación impulsada por eventos es el paradigma dominante utilizado en las interfaces gráficas de usuario y otras aplicaciones (por ejemplo, aplicaciones web JavaScript ) que se centran en realizar determinadas acciones en respuesta a la entrada del usuario . Esto también se aplica a la programación de controladores de dispositivos (p. Ej.,P en pilas de controladores de dispositivo USB [1] ).
En una aplicación impulsada por eventos, generalmente hay un bucle principal que escucha eventos y luego activa una función de devolución de llamada cuando se detecta uno de esos eventos. En los sistemas embebidos , se puede lograr lo mismo utilizando interrupciones de hardware en lugar de un bucle principal que se ejecuta constantemente. Los programas controlados por eventos se pueden escribir en cualquier lenguaje de programación , aunque la tarea es más fácil en lenguajes que proporcionan abstracciones de alto nivel , como await y closures .
Controladores de eventos
Un controlador de eventos trivial
Debido a que el código es para verificar eventos y el bucle principal es común entre las aplicaciones, muchos marcos de programación se encargan de su implementación y esperan que el usuario proporcione solo el código para los controladores de eventos. En este ejemplo simple, puede haber una llamada a un controlador de eventos llamado OnKeyEnter () que incluye un argumento con una cadena de caracteres, correspondiente a lo que el usuario escribió antes de presionar la tecla ENTER. Para agregar dos números, se debe usar el almacenamiento fuera del controlador de eventos. La implementación podría verse como a continuación.
declarar globalmente el contador K y el entero T.OnKeyEnter (carácter C){ convertir C en un número N si K es cero, almacenar N en T e incrementar K de lo contrario, agregue N a T, imprima el resultado y restablezca K a cero}
Si bien realizar un seguimiento del historial es normalmente trivial en un programa secuencial porque los controladores de eventos se ejecutan en respuesta a eventos externos, estructurar correctamente los controladores para que funcionen correctamente cuando se llaman en cualquier orden puede requerir atención y planificación especiales en un programa controlado por eventos.
Crear controladores de eventos
El primer paso para desarrollar un programa controlado por eventos es escribir una serie de subrutinas , o métodos , llamados rutinas de manejo de eventos. Estas rutinas manejan los eventos a los que responderá el programa principal. Por ejemplo, un solo clic del botón izquierdo del mouse en un botón de comando en un programa GUI puede activar una rutina que abrirá otra ventana, guardará datos en una base de datos o saldrá de la aplicación. Muchos entornos de programación de hoy en día proporcionan al programador plantillas de eventos, lo que le permite concentrarse en escribir el código del evento.
El segundo paso es vincular los controladores de eventos a los eventos para que se llame a la función correcta cuando se produzca el evento. Los editores gráficos combinan los dos primeros pasos: haga doble clic en un botón y el editor crea un controlador de eventos (vacío) asociado con el usuario que hace clic en el botón y abre una ventana de texto para que pueda editar el controlador de eventos.
El tercer paso en el desarrollo de un programa impulsado por eventos es escribir el bucle principal . Esta es una función que comprueba la ocurrencia de eventos y luego llama al controlador de eventos coincidente para procesarlo. La mayoría de los entornos de programación controlados por eventos ya proporcionan este bucle principal, por lo que no es necesario que lo proporcione específicamente el programador de la aplicación. RPG , un lenguaje de programación temprano de IBM , cuyo concepto de diseño de la década de 1960 era similar a la programación impulsada por eventos discutida anteriormente, proporcionó un bucle de E / S principal incorporado (conocido como el "ciclo de programa") donde los cálculos respondían de acuerdo con ' indicadores '( banderas ) que se establecieron anteriormente en el ciclo.
Controladores de excepciones en PL / I
En PL / I , a pesar de que un programa en sí mismo puede no ser predominantemente impulsado por eventos, pueden ocurrir ciertos eventos anormales como un error de hardware, desbordamiento o "comprobaciones de programa" que posiblemente impidan un procesamiento posterior. Los manejadores de excepciones pueden ser proporcionados por "declaraciones ON" en los llamadores (invisibles) para proporcionar rutinas de limpieza para limpiar después antes de la terminación, o para realizar operaciones de recuperación y volver al procedimiento interrumpido.
Usos comunes
La mayoría de las herramientas y arquitecturas de desarrollo de GUI existentes se basan en la programación impulsada por eventos. [2] El marco Java AWT procesa todos los cambios de la interfaz de usuario en un solo hilo, llamado hilo de despacho de eventos . De manera similar, todas las actualizaciones de la interfaz de usuario en el marco de Java JavaFX ocurren en el subproceso de aplicación JavaFX. [3]
Además, los sistemas como Node.js también están controlados por eventos. [4]
Crítica
Se ha criticado el diseño de aquellos programas que se basan en el modelo evento-acción y se ha sugerido que el modelo evento-acción lleva a los programadores a crear código de aplicación propenso a errores, difícil de extender y excesivamente complejo. [2] Las máquinas de estado controladas por tablas se han defendido como una alternativa viable. [5] Por otro lado, las propias máquinas de estado controladas por tablas sufren de importantes debilidades, incluido el fenómeno de explosión de estados . [6] Una solución para esto es utilizar redes de Petri .
Roscado sin pila
En los lenguajes de descripción de hardware se utiliza un enfoque basado en eventos . Un contexto de hilo solo necesita una pila de CPU mientras se procesa activamente un evento; una vez hecho esto, la CPU puede pasar a procesar otros subprocesos controlados por eventos, lo que permite manejar una gran cantidad de subprocesos. Este es esencialmente un enfoque de máquina de estados finitos .
Ver también
- Operación periférica autónoma
- Comparación de paradigmas de programación
- Programación de flujo de datos (un concepto similar)
- Eventos DOM
- Arquitectura impulsada por eventos
- Procesamiento de flujo de eventos (un concepto similar)
- Lenguaje de descripción de hardware
- Interrumpir
- Inversión de control
- Middleware orientado a mensajes
- Paradigma de programación
- Patrón de publicación-suscripción
- Patrón de reactor
- Programación de señales (un concepto similar)
- Arquitectura basada en eventos por etapas (SEDA)
- Sistema activado por tiempo (una arquitectura alternativa para sistemas informáticos)
- Sincronía virtual , un modelo de ejecución distribuida para la programación impulsada por eventos
Referencias
- ^ Vivek Gupta, Ethan Jackson, Shaz Qadeer y Sriram Rajamani (noviembre de 2012). "P: Programación basada en eventos asincrónica segura" . Investigación de Microsoft . Consultado el 20 de febrero de 2017 .Mantenimiento de CS1: utiliza el parámetro de autores ( enlace )
- ^ a b Samek, Miro (1 de abril de 2013). "¿Quién movió mi estado?" . Dr. Dobb's . Consultado el 28 de enero de 2018 .
- ^ Fedortsova, Irina (junio de 2012). "Concurrencia en JavaFX" . Inicio de la documentación de JavaFX . Oracle . Consultado el 4 de enero de 2018 .
El gráfico de escena JavaFX, que representa la interfaz gráfica de usuario de una aplicación JavaFX, no es seguro para subprocesos y solo se puede acceder y modificar desde el subproceso de la interfaz de usuario, también conocido como subproceso de la aplicación JavaFX.
- ^ Programación dirigido por eventos en Node.js .
- ^ Samek, Miro (11 de marzo de 2009). "Máquinas de estado para sistemas controlados por eventos" . Consultado el 19 de marzo de 2013 .
- ^ Patrick Schaumont (27 de noviembre de 2012). Una introducción práctica al diseño de códigos de hardware / software . ISBN 978-1-4614-3737-6.
enlaces externos
- Presentación de patrones de concurrencia dada en scaleconf
- Programación basada en eventos: introducción, tutorial, historia , tutorial de Stephen Ferg
- Programación basada en eventos , tutorial de Alan Gauld
- Event Collaboration , artículo de Martin Fowler
- Rethinking Swing Threading , artículo de Jonathan Simon
- El estilo de programación impulsado por eventos Archivado 2005-02-20 en Wayback Machine , artículo de Chris McDonald
- Programación basada en eventos con especialización en plantillas , artículo de Christopher Diggins
- Schiffer, S .; Frohlich, JH (1994). "Conceptos y arquitectura de Vista-un entorno de programación multiparadigma". Actas del Simposio IEEE de 1994 sobre lenguajes visuales . págs. 40–47. doi : 10.1109 / VL.1994.363642 . ISBN 0-8186-6660-9.
- Programación y agentes controlados por eventos , capítulo
- Recursos de LabWindows / CVI
- Distributed Publish / Subscribe Event System , un ejemplo de código abierto que está en producción en MSN.com y Microsoft.com
- Bucle de eventos de Javascript