Biblioteca C ++ que proporciona la funcionalidad de un bucle de eventos para procesar eventos instantáneos y programados para aplicaciones impulsadas por eventos
El bucle de eventos procesa eventos para notificar a los receptores registrados opcionalmente con datos
Puede usar el bucle de eventos para bloquear el hilo actual para el procesamiento de eventos o como hilo independiente que sale del hilo actual para otras tareas
Nota: Esta biblioteca proporciona un marco para procesos de eventos múltiples en el mismo proceso sin ninguna capacidad de IPC
EventLoop::Mode::BLOCK Este modo de bucle de eventos bloqueará el hilo actual (generalmente el hilo principal) donde se ha emitido la llamada EventLoop::Run()
El hilo actual continuará procesando eventos siempre que el bucle se esté ejecutando
EventLoop::Mode::NON_BLOCK Este modo ejecutará el bucle de eventos en otro hilo que evitará el hilo actual donde se ha emitido la llamada EventLoop::Run()
Esto puede resultar útil donde el hilo actual debe llegar a alguna ejecución después de comenzar el bucle de eventos en el mismo hilo o si ya usa un bucle de eventos de bloqueo propio. Un ejemplo de este último puede ser la llamada QGuiApplication::exec() del marco QT que bloquea el hilo principal y comienza a procesar eventos
Eso plantea una pregunta importante: ¿por qué se necesitaba un bucle de evento secundario cuando ya existe uno principal como QT exec() ?
No sé sobre ti, pero me perdí mucho algunas características en el bucle de eventos de QT, como la capacidad de transmitir una señal a todos los receptores que se han registrado/suscrito a ella. ¡Esta fue la principal motivación para desarrollar una biblioteca de bucle de eventos desde cero, además de otros como mi insaciable curiosidad por cómo funcionan las cosas y una picazón para los alimentos para perros!
La transmisión es por excelencia cuando desea que múltiples componentes de la aplicación actúen sobre un solo estímulo sin tener que conectar cada receptor con la explicidad del remitente. ¡Buena suerte pasando las instancias del remitente a múltiples receptores y creando una conexión de ranura de señal para cada uno para habilitar la recepción de transmisión en QT!
Otra razón sólida era crear un sistema de procesamiento de eventos global para toda la aplicación sin ninguna referencia al proveedor de eventos o objetos de remitente y receptor asociados para registrarse y activar un evento. EventLoop es una clase estática independiente con métodos estáticos que permiten al desarrollador emitir una llamada API de absolutamente cualquier hilo, en cualquier lugar del código a diferencia de QT, donde se requieren manijas del remitente y los objetos del receptor para crear conexiones y emitir señales.
Como usuario, puede vincular dinámicamente la biblioteca de bucle de eventos a su aplicación e incluir el encabezado EventLoop.h en su código de aplicación para acceder a los métodos de la biblioteca. Dado que estamos utilizando Event como tipo personalizado para entregar y recibir eventos con nombre y datos, el encabezado de Event.h .
Nota: No incluya ningún otro encabezado del directorio de inclusión de este proyecto, aparte de los mencionados anteriormente cuando se usa la biblioteca en su aplicación. Otra forma de recordar es que solo necesita los archivos de encabezado
.hpara su aplicación y todos los archivos.hppse pueden ignorar
La documentación de API detallada se puede encontrar en el encabezado EventLoop.h . Los siguientes pasos demuestran un posible uso del bucle de eventos en su aplicación:
main() de su programa, llame al método EventLoop::SetMode() si desea que el bucle no sea bloqueado. No es necesario llamar a esto explícitamente para el modo de bloqueo porque ese es el modo predeterminadoEventLoop::Run() en main() donde desea que el bucle de eventos inicie y/o bloqueeEvent* en cualquier clase o archivo de origen con EventLoop::RegisterEvent() donde desea recibir una notificación para un evento. Por lo general, los registros se realizan en constructores de clase con lambdas o funciones de miembros de clase como manejadoresEventLoop::TriggerEvent() y los controladores correspondientes que registrados para el nombre del evento en particular se invocarán instantáneamente o después de un tiempo de espera dependiendo del tipo de sobrecarga utilizadaEvent Event::getName() y Event::getData()EventLoop::Halt() . Este método se puede llamar desde cualquier hilo en cualquiera de los modos. Si se llama dentro de un controlador registrado, solo entrará en vigencia al finalizar el alcance del controladorConsejo: Si planea usar
EventLoopademás del bucle de eventosexec()de QT, configureEventLoop::Run()antes de la llamadaexec()yEventLoop::Halt()para invocar en la señalQGuiApplication::aboutToQuitde la siguiente manera para una salida elegante para una salida elegante
QObject::connect(&app, &QGuiApplication::aboutToQuit, []{ EventLoop::Halt(); });
Nota: Cualquier código justo después de un bloqueo
EventLoop::Run()Llame en el mismo hilo no se ejecutará hasta que se detenga el bucle de eventos porqueEventLoop::Run()bloquea el hilo actual para procesar eventos por diseño.
La aplicación de carrito de compras sirve como referencia de uso de esta biblioteca y API. En caso de cualquier pregunta o aclaración, puede comunicarse conmigo en [email protected]
Verifique las últimas versiones estables de la biblioteca en Releases pero si desea construir una biblioteca a partir de la fuente con la versión actual del código fuente, ejecute el script build.sh
El script se puede ejecutar sin ninguna opción. Los valores predeterminados para cada opción aparecerán en {} en la instrucción de uso. Aprenda sobre el uso del script ejecutando el siguiente comando
./build.sh -h
Como ejemplo, si desea usar el script para construir el modo de liberación con Unix Makefiles cmake generador, el script se puede ejecutar de la siguiente manera
./build.sh -a -r -g "Unix Makefiles"
Los artefactos de construcción se generarán en el directorio build
El artefacto de salida estará presente en el directorio lib como libEventLoop.so
Puede contribuir al proyecto si cree
Como colaborador potencial puedes
Siéntete libre, ponte en contacto conmigo en caso de cualquier pregunta o sugerencia [email protected]