C ++ -Bibliothek Bereitstellung der Funktionalität einer Ereignisschleife zur Verarbeitung sofortiger und geplanter Ereignisse für ereignisgesteuerte Anwendungen
Die Ereignisschleife verarbeitet Ereignisse, um registrierte Empfänger optional mit Daten zu benachrichtigen
Sie können die Ereignisschleife verwenden, um den aktuellen Thread für die Ereignisverarbeitung oder als unabhängiger Thread zu blockieren, sodass der aktuelle Thread für andere Aufgaben frei ist
Hinweis: Diese Bibliothek bietet ein Framework für Multi-Thread-Ereignisverfahren innerhalb desselben Prozesses ohne IPC-Funktionen
EventLoop::Mode::BLOCK Diese Art der Ereignisschleife blockiert den aktuellen Thread (normalerweise Haupt -Thread), in dem der Call EventLoop::Run() ausgestellt wurde
Der aktuelle Thread setzt dann die Ereignisse fort, solange die Schleife ausgeführt wird
EventLoop::Mode::NON_BLOCK In diesem Modus wird die Ereignisschleife in einem anderen Thread ausgeführt, der den aktuellen Thread verhindern, in dem der Anruf EventLoop::Run() ausgestellt wurde, indem er blockiert wird
Dies kann sich als nützlich erweisen, wenn der aktuelle Thread nach dem Start der Ereignisschleife im selben Thread entweder zu einer Ausführung gelangen muss oder ob bereits eine eigene Blockierereignisschleife verwendet wird. Ein Beispiel für letztere kann das QGuiApplication::exec() , der den Haupt -Thread blockiert und die Verarbeitung von Ereignissen startet
Das wirft eine wichtige Frage auf: Warum wurde eine sekundäre Ereignisschleife benötigt, wenn bereits ein primärer wie QTs exec() existiert?
Ich weiß nichts über Sie, aber ich habe einige Funktionen in der Event -Schleife von QT sehr verpasst, als ob sie die Möglichkeit haben, ein Signal an alle Empfänger zu übertragen, die es registriert/abonniert haben. Dies war die Hauptmotivation für die Entwicklung einer Event -Loop -Bibliothek von Grund auf neu, abgesehen von einigen anderen, wie meine unersättliche Neugier für die Funktionsweise von Dingen und einen Juckreiz für Dogfooding!
Das Rundfunk ist in Frage gestellt, wenn mehrere Komponenten der Anwendung auf einen einzelnen Stimulus einwirken möchten, ohne jeden Empfänger mit dem Absenderexxperium verbinden zu müssen. Viel Glück, an den Senderinstanzen an mehrere Recies und eine Signalschlitzverbindung für jeden zu erstellen, um den Broadcast -Empfang in QT zu aktivieren!
Ein weiterer solider Grund bestand darin, ein globales Ereignisverarbeitungssystem für die gesamte Anwendung zu erstellen, ohne auf den Ereignisanbieter oder den zugehörigen Absender und den Empfängerobjekten zu verweisen, um ein Ereignis zu registrieren und auszulösen. EventLoop ist eine eigenständige statische Klasse mit statischen Methoden, mit denen der Entwickler einen API -Aufruf von absolut jedem Thread ausgeben kann, überall im Code, anders als in QT, bei dem die Griffe des Absenders und des Empfängerobjektes erforderlich sind, um Verbindungen zu erstellen und Signale auszugeben.
Als Benutzer können Sie die Event -Loop -Bibliothek dynamisch mit Ihrer Anwendung verknüpfen und den Header EventLoop.h in Ihren Anwendungscode einbeziehen, um auf die Bibliotheksmethoden zuzugreifen. Da wir Event als benutzerdefinierten Typ zum Liefer- und Empfangen von Ereignissen mit Namen und Daten verwenden, wird Event.h .
HINWEIS: Fügen Sie keine anderen Header aus dem Verzeichnis dieses Projekts bei, abgesehen von den oben genannten, wenn Sie die Bibliothek in Ihrer Anwendung verwenden. Eine andere Möglichkeit, sich zu erinnern, ist, dass Sie nur die
.h-Header -Dateien für Ihre App benötigen und alle.hpp-Dateien können ignoriert werden
Eine detaillierte API -Dokumentation finden Sie im Header EventLoop.h . Die folgenden Schritte zeigen eine mögliche Verwendung der Ereignisschleife in Ihrer Bewerbung:
main() Ihres Programms rufen Sie EventLoop::SetMode() -Methode auf, wenn die Schleife nicht blockiert werden soll. Sie müssen dies nicht explizit für den Blockierungsmodus anrufen, da dies der Standardmodus istEventLoop::Run() -Methode in main() an, wobei Sie die Ereignisschleife starten und/oder blockieren möchtenEvent* in einer beliebigen Klasse oder Quelldatei mit EventLoop::RegisterEvent() , wo Sie für ein Ereignis benachrichtigt werden möchten. Normalerweise werden Registrierungen in Klassenkonstruktoren mit Lambdas oder Klassenmitgliedern als Handler durchgeführtEventLoop::TriggerEvent() und den entsprechenden Handlern, die für den jeweiligen Ereignisnamen registriert sindEvent Event::getName() und Event::getData() -Methoden abEventLoop::Halt() anmutig zu beenden. Diese Methode kann von jedem Thread in beiden Modi aufgerufen werden. Wenn Sie in einem registrierten Handler gerufen werden, wird dies nur nach Abschluss des Handlersbereichs wirksamTipp: Wenn Sie vorhaben,
EventLoopüber den Ereignisschleife von QTexec()zu verwenden, stellen SieEventLoop::Run()vor demexec()Call undEventLoop::Halt()auf demQGuiApplication::aboutToQuit-Signal wie folgt für einen anmutigen Ausgang ein
QObject::connect(&app, &QGuiApplication::aboutToQuit, []{ EventLoop::Halt(); });
Hinweis: Jeder Code direkt nach einem Blocking
EventLoop::Run()Aufruf im selben Thread wird erst ausgeführt, wenn die Ereignisschleife gestoppt wird, daEventLoop::Run()den aktuellen Thread blockiert, um Ereignisse nach Design zu verarbeiten.
Die Einkaufswagen -App dient als Verwendungsreferenz dieser Bibliothek und API. Bei Fragen oder Klarstellungen können Sie mich unter [email protected] an mich wenden
Überprüfen build.sh die neuesten stabilen Veröffentlichungen der Bibliothek unter Releases
Das Skript kann ohne Optionen ausgeführt werden. Standardeinstellungen für jede Option werden in {} in der Verwendungsanweisung angezeigt. Erfahren Sie mehr über die Skriptverwendung, indem Sie den folgenden Befehl ausführen
./build.sh -h
Wenn Sie beispielsweise das Skript verwenden möchten, um mit Unix Makefiles CMake -Generator für den Release -Modus zu erstellen, kann das Skript wie folgt ausgeführt werden
./build.sh -a -r -g "Unix Makefiles"
Build -Artefakte werden im build -Verzeichnis erzeugt
Das Ausgangsartefakt wird im lib -Verzeichnis als libEventLoop.so vorhanden sein, das weiter verknüpft oder zu Ihrem Zielziel verschoben werden kann
Sie sind herzlich eingeladen, zum Projekt beizutragen, wenn Sie denken
Als potenzieller Mitarbeiter können Sie
Fühlen Sie sich frei in Kontakt mit mir bei Fragen oder Vorschlägen [email protected]