Bibliothèque C ++ fournissant la fonctionnalité d'une boucle d'événements pour traiter les événements instantanés et planifiés pour des applications motivées d'événements
La boucle d'événement traite les événements pour informer les récepteurs enregistrés éventuels avec des données
Vous pouvez utiliser la boucle d'événements pour bloquer le thread actuel pour le traitement des événements ou comme thread indépendant laissant le fil actuel sans tâches
Remarque: Cette bibliothèque fournit un cadre pour le processus d'événements multiplié dans le même processus sans aucune capacité IPC
EventLoop::Mode::BLOCK Ce mode de boucle d'événements bloquera le thread actuel (généralement le thread principal) où l'appel EventLoop::Run() a été émis
Le thread actuel continuera alors de traitement des événements tant que la boucle fonctionne
EventLoop::Mode::NON_BLOCK Ce mode exécutera la boucle d'événement sur un autre thread qui empêchera le thread actuel où l'appel EventLoop::Run() a été émis de bloquer
Cela peut s'avérer utile où le thread actuel doit soit accéder à une exécution après avoir commencé la boucle d'événement sur le même thread ou s'il utilise déjà une boucle d'événement de blocage qui lui est propre. Un exemple de ce dernier peut être l'appel QGuiApplication::exec() du Framework QT qui bloque le thread principal et commence les événements de traitement
Cela soulève une question importante: pourquoi une boucle d'événement secondaire était-elle nécessaire alors qu'un principal comme QT exec() existe déjà?
Je ne sais pas pour vous, mais j'ai vraiment manqué certaines fonctionnalités de la boucle d'événement de QT comme la possibilité de diffuser un signal à tous les récepteurs qui s'y sont inscrits / abonnés. Ce fut la principale motivation pour développer une bibliothèque de boucle d'événements à partir de zéro, à part d'autres comme ma curiosité insatiable pour la façon dont les choses fonctionnent et une démangeaison pour le choeur!
La radiodiffusion est quintessentielle lorsque vous souhaitez que plusieurs composantes de l'application agissent sur un seul stimulus sans avoir à connecter chaque récepteur à l'expliciteur de l'expéditeur. Bonne chance pour faire le tour des instances de l'expéditeur à plusieurs reçus et créer une connexion à l'emplacement de signal pour chacun pour permettre la réception de diffusion en QT!
Une autre raison solide a été de créer un système mondial de traitement d'événements pour l'ensemble de l'application sans références au fournisseur d'événements ou à l'expéditeur et aux objets récepteurs associés afin de s'inscrire et de déclencher un événement. EventLoop est une classe statique autonome avec des méthodes statiques permettant au développeur d'émettre un appel API à partir de n'importe quel thread, n'importe où dans le code contrairement à QT où des poignées de l'expéditeur et des objets récepteurs sont nécessaires pour créer des connexions et émettre des signaux.
En tant qu'utilisateur, vous pouvez lier dynamiquement la bibliothèque de boucle d'événements à votre application et inclure l'en-tête EventLoop.h dans votre code d'application pour accéder aux méthodes de la bibliothèque. Étant donné que nous utilisons Event comme type personnalisé pour livrer et recevoir des événements avec nom et données, Event.h .
Remarque: n'incluez pas d'autres en-têtes du répertoire inclué de ce projet à l'exception de ceux mentionnés ci-dessus lors de l'utilisation de la bibliothèque dans votre application. Une autre façon de se souvenir est que vous n'avez besoin que des fichiers d'en-tête
.hpour votre application et que tous les fichiers.hpppeuvent être ignorés
Une documentation détaillée de l'API peut être trouvée dans l'en-tête EventLoop.h . Les étapes suivantes montrent une utilisation possible de la boucle d'événements dans votre application:
main() de votre programme, appelez EventLoop::SetMode() Méthode Si vous souhaitez que la boucle ne soit pas bloquée. Pas besoin d'appeler cela explicitement pour le mode de blocage car c'est le mode par défautEventLoop::Run() dans main() où vous souhaitez que la boucle d'événement commence et / ou bloqueEvent* dans n'importe quelle classe ou fichier source avec EventLoop::RegisterEvent() où vous souhaitez être informé d'un événement. Habituellement, les inscriptions sont effectuées dans les constructeurs de classe avec des lambdas ou des fonctions de membre de la classe en tant que gestionnairesEventLoop::TriggerEvent() et les gestionnaires correspondants qui se sont inscrits au nom de l'événement particulier seront invoqués instantanés ou après un délai d'expiration en fonction du type de surcharge utiliséeEvent Event::getName() et Event::getData() MéthodesEventLoop::Halt() . Cette méthode peut être appelée à partir de n'importe quel thread dans les deux modes. S'il est appelé à l'intérieur d'un gestionnaire enregistré, il ne prendra effet qu'à l'achèvement de la portée du gestionnaireAstuce: si vous prévoyez d'utiliser
EventLoopen plus de la boucle d'événementexec()deQGuiApplication::aboutToQuit, configurez-vousEventLoop::Run()avant l'appelexec()etEventLoop::Halt()
QObject::connect(&app, &QGuiApplication::aboutToQuit, []{ EventLoop::Halt(); });
Remarque: Tout code juste après un appel
EventLoop::Run()sur le même thread ne s'exécutera pas tant que la boucle d'événement ne sera pas interrompue parce queEventLoop::Run()bloque le thread actuel pour traiter les événements par conception.
L'application de panier sert de référence d'utilisation de cette bibliothèque et de cette API. En cas de questions ou de clarifications, vous pouvez me contacter à [email protected]
Vérifiez les dernières versions stables de la bibliothèque dans Releases mais si vous souhaitez créer une bibliothèque à partir de Source avec la version actuelle du code source, exécutez le script build.sh
Le script peut être exécuté sans aucune option. Les défauts pour chaque option apparaîtront dans {} dans l'instruction d'utilisation. Découvrez l'utilisation du script en exécutant la commande suivante
./build.sh -h
À titre d'exemple, si vous souhaitez utiliser le script pour construire pour le mode de libération avec Unix Makefiles Cmake Generator, le script peut être exécuté comme suit
./build.sh -a -r -g "Unix Makefiles"
Les artefacts de construction seront générés dans le répertoire build
L'artefact de sortie sera présent dans le répertoire lib en tant que libEventLoop.so
Vous êtes invités à contribuer au projet si vous pensez
En tant que contributeur potentiel, vous pouvez
N'hésitez pas à me contacter en cas de questions ou de suggestions [email protected]