Terminologie
event : Eine Art von Sache, die passieren kann.
Ereignisauslösung : Ein bestimmtes Auftreten eines Ereignisses; ein Ereignis passiert.
Ereignis-Listener : Etwas, das auf Ereignisauslösungen achtet.
Ereignishandler : Dies tritt auf, wenn ein Ereignis-Listener einen Ereignisauslöser erkennt.
Ereignisabonnent : Eine Antwort, die der Ereignishandler aufrufen soll.
Diese Definitionen hängen nicht von der Implementierung ab, sodass sie auf verschiedene Arten implementiert werden können.
Einige dieser Begriffe werden häufig mit Synonymen verwechselt, da Benutzer häufig nicht zwischen ihnen unterscheiden müssen.
Häufige Szenarien
Programmierlogik-Ereignisse.
Das Ereignis tritt auf, wenn eine Methode aufgerufen wird.
Eine Ereignisauslösung ist ein bestimmter Aufruf dieser Methode.
Der Ereignis-Listener ist ein Hook in der Ereignismethode, die bei jedem Ereignisauslöser aufgerufen wird, der den Ereignishandler aufruft.
Die Ereignisbehandlungsroutine ruft eine Sammlung von Ereignisabonnenten auf.
Die Ereignis-Teilnehmer führen alle Aktionen aus, die das System als Reaktion auf das Ereignis ausführen möchte.
Externe Ereignisse.
Das Ereignis ist ein externes Ereignis, das aus Observablen abgeleitet werden kann.
Eine Ereignisauslösung ist, wenn dieses externe Ereignis als eingetreten erkannt werden kann.
Der Ereignis-Listener erkennt auf irgendeine Weise Ereignisauslösungen, häufig durch Abfragen der Observable (s), und ruft dann die Ereignisbehandlungsroutine auf, wenn er eine Ereignisauslösung erkennt.
Die Ereignisbehandlungsroutine ruft eine Sammlung von Ereignisabonnenten auf.
Die Ereignis-Teilnehmer führen alle Aktionen aus, die das System als Reaktion auf das Ereignis ausführen möchte.
Polling vs. Einfügen von Hooks in den Auslösemechanismus des Events
Der Punkt, den andere sagen, ist, dass Umfragen oft nicht notwendig sind. Dies liegt daran, dass Ereignis-Listener implementiert werden können, indem Ereignisauslösungen automatisch den Ereignishandler aufrufen. Dies ist häufig die effizienteste Methode, um Ereignisse zu implementieren, die auf Systemebene auftreten.
Analog müssen Sie nicht jeden Tag in Ihrem Briefkasten nach der Post suchen, wenn der Postbote an Ihre Tür klopft und die Post direkt an Sie weitergibt.
Ereignis-Listener können jedoch auch durch Abfragen arbeiten. Bei der Abfrage muss nicht unbedingt ein bestimmter Wert oder eine andere beobachtbare Größe überprüft werden. es kann komplexer sein. Insgesamt besteht der Punkt der Abfrage jedoch darin, zu schließen, wann ein Ereignis aufgetreten ist, so dass darauf reagiert werden kann.
Analog dazu müssen Sie jeden Tag in Ihrem Briefkasten nachsehen, wenn der Postbeamte gerade die Post dort abliefert. Sie müssten diese Umfrage nicht durchführen, wenn Sie den Postangestellten anweisen könnten, an Ihre Tür zu klopfen, aber dies ist häufig nicht möglich.
Verkettung der Ereignislogik
In vielen Programmiersprachen können Sie ein Ereignis schreiben, das nur aufgerufen wird, wenn eine Taste auf der Tastatur gedrückt wird oder zu einer bestimmten Zeit. Obwohl es sich um externe Ereignisse handelt, müssen Sie diese nicht abfragen. Warum?
Es ist, weil das Betriebssystem für Sie abruft. Windows prüft beispielsweise auf Änderungen des Tastaturstatus und ruft Ereignisabonnenten an, wenn eines erkannt wird. Wenn Sie also ein Tastaturdruckereignis abonnieren, abonnieren Sie tatsächlich ein Ereignis, bei dem es sich selbst um einen Abonnenten eines abfragenden Ereignisses handelt.
Nehmen wir analog an, Sie leben in einem Apartmentkomplex und ein Postangestellter schickt die Post in einen Empfangsbereich für Gemeinschaftspost. Dann kann ein Mitarbeiter, der einem Betriebssystem ähnelt, für alle Benutzer nach dieser E-Mail suchen und diese an die Apartments derjenigen senden, die etwas erhalten haben. Dies erspart allen anderen die Notwendigkeit, den Posteingangsbereich abzufragen.
Meine Intuition würde annehmen, dass der Ereignis-Listener ständig prüft, ob das Ereignis ausgelöst wurde, was bedeutet, dass es in meinem Szenario nicht anders ist, als jeden Frame zu prüfen, wenn das Ereignis ausgelöst wurde.
Aufgrund der Diskussion in der Klasse scheint der Ereignis-Listener anders zu arbeiten.
Wie funktioniert ein Ereignis-Listener?
Wie Sie vermutet haben, ein Ereignis kann durch Polling arbeiten. Und wenn ein Ereignis in irgendeiner Weise mit externen Ereignissen zusammenhängt, z. B. dem Drücken einer Tastaturtaste, muss irgendwann ein Abruf stattfinden.
Es ist nur auch wahr, dass Ereignisse nicht unbedingt eine Abstimmung beinhalten müssen. Wenn das Ereignis beispielsweise ein Drücken einer Schaltfläche ist, ist der Ereignis-Listener dieser Schaltfläche eine Methode, die das GUI-Framework möglicherweise aufruft, wenn festgestellt wird, dass ein Mausklick auf die Schaltfläche zutrifft. In diesem Fall musste noch eine Abfrage durchgeführt werden, damit der Mausklick erkannt wurde. Der Maushörer ist jedoch ein passiveres Element, das über die Ereignisverkettung mit dem primitiven Abfragemechanismus verbunden ist.
Update: Bei Low-Level-Hardware-Polling
Es stellt sich heraus, dass USB-Geräte und andere moderne Kommunikationsprotokolle über eine faszinierende Reihe netzwerkähnlicher Protokolle für Interaktionen verfügen, die es E / A-Geräten, einschließlich Tastaturen und Mäusen, ermöglichen, sich an Ad-hoc- Topologien zu beteiligen.
Interessanterweise sind " Interrupts " ziemlich zwingende, synchrone Dinge, sodass sie keine Ad-hoc- Netzwerktopologien handhaben . Um dies zu beheben, wurden " Interrupts " in asynchrone Pakete mit hoher Priorität verallgemeinert, die als " Interrupt-Transaktionen " (im Kontext von USB) oder " nachrichtengesteuerte Interrupts " (im Kontext von PCI) bezeichnet werden. Dieses Protokoll ist in einer USB-Spezifikation beschrieben:
- " Abbildung 8-31. Bulk- / Steuer- / Interrupt-OUT-Transaktionshost-Zustandsmaschine " in "Universal Serial Bus Specification, Revision 2.0" , Printed-Page-222; PDF-Seite-250 (2000-04-27)
Das Wesentliche scheint zu sein, dass E / A-Geräte und Kommunikationskomponenten (wie USB-Hubs) im Grunde genommen wie Netzwerkgeräte funktionieren. Sie senden also Nachrichten, für die ihre Ports abgefragt werden müssen. Dies verringert den Bedarf an dedizierten Hardware-Leitungen.
Betriebssysteme wie Windows scheinen den Abfrageprozess selbst, zum Beispiel wie beschrieben in der Handhabung MSDN - Dokumentation für den USB_ENDPOINT_DESCRIPTOR
‚s , die beschreibt , wie Sie steuern , wie oft Windows - Umfragen ein USB - Host - Controller für Interrupt / isochronen Meldungen:
Der bInterval
Wert enthält das Abfrageintervall für Interrupt- und isochrone Endpunkte. Bei anderen Endpunkttypen sollte dieser Wert ignoriert werden. Dieser Wert gibt die Konfiguration des Geräts in der Firmware wieder. Treiber können es nicht ändern.
Das Abfrageintervall bestimmt zusammen mit der Geschwindigkeit des Geräts und dem Typ des Host-Controllers die Häufigkeit, mit der der Treiber einen Interrupt oder eine isochrone Übertragung initiieren soll. Der Wert in bInterval
stellt keine feste Zeitdauer dar. Dies ist ein relativer Wert, und die tatsächliche Abruffrequenz hängt auch davon ab, ob das Gerät und der USB-Host-Controller mit niedriger, voller oder hoher Geschwindigkeit arbeiten.
- "USB_ENDPOINT_DESCRIPTOR-Struktur" , Hardware Dev Center, Microsoft
Neuere Monitorverbindungsprotokolle wie DisplayPort scheinen dasselbe zu tun:
Multi-Stream-Transport (MST)
-Dia # 14 aus "DisplayPortTM Ver.1.2 Übersicht" (06.12.2010)
Diese Abstraktion ermöglicht einige nette Funktionen, wie das Ausführen von 3 Monitoren über eine Verbindung:
Mit DisplayPort Multi-Stream Transport können auch drei oder mehr Geräte miteinander verbunden werden, jedoch in der entgegengesetzten, weniger verbraucherorientierten Konfiguration: Mehrere Displays können gleichzeitig über einen einzigen Ausgangsport angesteuert werden.
- "DisplayPort" , Wikipedia
Aus konzeptioneller Sicht sollten Sie davon absehen, dass Abfragemechanismen eine allgemeinere serielle Kommunikation ermöglichen. Dies ist fantastisch, wenn Sie allgemeinere Funktionen wünschen. Die Hardware und das Betriebssystem führen also viele Abfragen für das logische System durch. Dann können Verbraucher, die Ereignisse abonnieren, diese Details genießen, die vom untergeordneten System für sie verarbeitet werden, ohne dass sie ihre eigenen Abruf- / Nachrichtenübermittlungsprotokolle schreiben müssen.
Letztendlich scheinen Ereignisse wie Tastendrücke eine ziemlich interessante Reihe von Ereignissen zu durchlaufen, bevor sie zum zwingenden Ereignisauslösemechanismus der Software-Ebene gelangen.