Wie funktionieren Event-Handler im Allgemeinen?

14

Dies ist ein allgemeines Thema. Wie funktionieren Event-Handler?

Das bedeutet hinter den Kulissen - was passiert, wenn sie erstellt werden.

Ich habe eine grobe Idee - möchte sie aber gerne bestätigen lassen.

JHarley1
quelle
Brillant, das Observer-Muster war das, was ich gefunden hatte: Ich habe im Internet zu diesem Thema gelesen und einen guten Artikel zum Thema Event Driven Programming gelesen. In diesem Artikel wird der Prozess des Handler-Entwurfsmusters erörtert. Wobei Sie eine Fülle von Ereignissen haben, die zu einem Dispatcher kommen, der dieses Ereignis aufnimmt und analysiert, um seinen Ereignistyp zu bestimmen, und dann jedes Ereignis an einen Handler sendet, der Ereignisse dieses Typs verarbeiten kann.
JHarley1
1
Es wird erklärt, wie der Dispatcher es zu einer Endlosschleife macht, die nur stoppt, wenn (zum Beispiel mit einer GUI-Anwendung) das Programm geschlossen wird. Und dann, wie Sie ein Observer-Pattern (oder das Publish / Subscribe-Pattern) haben, das häufig für die ereignisgesteuerte Programmierung mit GUI-Frameworks verwendet wird, und wie es nach dem Hollywood-Prinzip "Rufen Sie uns nicht an, wir rufen Sie an" funktioniert. .
JHarley1
Würden Sie sagen, dass die obige Erklärung angemessen ist?
JHarley1
Es hängt davon ab, ob. Für eine gute Übersicht ist es in Ordnung. Für eine umfassende und gründliche Erklärung, bitte nicht. Natürlich würde eine solche Erklärung wahrscheinlich viele Arbeitsseiten umfassen, da dies ziemlich ausgefallen sein kann, da Sie sich zum Beispiel mit Web- oder Desktop-Ereignissen befassen könnten.
JB King

Antworten:

15

Auf einer niedrigen Ebene arbeiten Ereignishandler häufig mit der Abfrage eines Geräts und auf einen Hardware-Interrupt warten. Im Wesentlichen wird ein Hintergrund-Thread blockiert, während auf das Auftreten eines Hardware-Interrupts gewartet wird. Wenn ein Interrupt auftritt, stoppt die Polling-Funktion die Blockierung. Die Anwendung kann dann herausfinden, welches Gerätehandle den Interrupt verursacht hat und um welche Art von Interrupt es sich handelt, und dann entsprechend vorgehen (z. B. durch Aufrufen einer Event-Handler-Funktion). Dies geschieht normalerweise in einem separaten Thread, sodass es asynchron geschieht.

Natürlich ist die Art und Weise, wie dies tatsächlich implementiert wird, je nach Betriebssystem und Art des Geräts / Eingangs sehr unterschiedlich. Auf UNIX-Systemen können Ereignisbehandlungsroutinen für Sockets, serielle oder USB-Ports zum Beispiel über select oder poll implementiert werden Systemaufrufe implementiert werden. Eine oder mehrere Datei- / Gerätedeskriptoren (die einem Gerät zugeordnet sind, z. B. ein Netzwerksocket, ein serieller / USB-Anschluss usw.) werden an den pollSystemaufruf übergeben, der dem Programmierer über eine C-API auf niedriger Ebene zur Verfügung gestellt wird. Wenn ein Ereignis auf einem dieser Geräte auftritt (z. B. wenn einige Daten über einen seriellen Anschluss eingehen), wird der Abfragesystemaufruf nicht mehr blockiert, und die Anwendung kann dann feststellen, welcher Gerätedeskriptor das Ereignis verursacht hat und um welchen Ereignistyp es sich handelt .

Unter Windows wird dies anders gehandhabt, aber die Konzepte sind im Grunde gleich.

Charles Salvia
quelle