Ereignis (Programmierung)

Ein Ereignis (englisch event) dient in der Softwaretechnik – bei Entwicklung nach dem ereignisorientierten Programmierparadigma – zur Steuerung des Programmflusses. Das Programm wird nicht linear durchlaufen, sondern es werden spezielle Ereignisbehandlungsroutinen (engl. listener, observer, event handler) immer dann ausgeführt, wenn ein bestimmtes Ereignis auftritt. Ereignisorientierte Programmierung gehört zu den parallelen Programmiertechniken, hat also deren Vor- und Nachteile.

Motivation

In Computerprogrammen kommt es häufig vor, dass auf Ressourcenanforderungen wie z. B. bei Speicheranforderungen und anderen Gerätezugriffen eine unvorhersagbar lange Zeit gewartet werden muss oder Ereignisse spontan auftreten können, z. B. Mausklicks, das Drücken von Tasten oder Tastenkombinationen oder das Öffnen, das Schließen oder die Größenänderung oder Timer-Abläufe durch den Anwender. Bei älterer Programmierung ohne Ereignisse oder auch mit einem einzigen, sequentiellen Kontrollfluss wird dieses Warten auf das Eintreten des Ereignisses z. B. die erfolgreiche Ressourcenzuweisung über ein aktives, beobachtendes Warten, das auch sogenannte Polling, durchgeführt.

Polling besitzt einige nachteilige Eigenschaften: Da die Programmausführung (scheinbar) solange angehalten wird, bis das Ereignis eintritt, ist die Programm-Leistungsfähigkeit schlechter und ebenso die Antwortzeiten nicht vorhersagbar. Auch kann auf andere Ereignisse, während des beobachtenden Wartens, gar nicht reagiert werden, d. h. diese gehen möglicherweise verloren. Und die Ausführung des beobachtenden Wartens benötigt unvorhersagbar viel Rechenzeit, da dieselbe Handlung – die Prüfung, ob das Ereignis eingetreten ist – unvorhersagbar oft wiederholt werden muss.

Definition

In der Programmierung ist ein Eventhandler eine Rückruffunktion, die asynchron arbeitet, sobald ein Ereignis eintritt. Es bestimmt die Aktion, die auf das Ereignis folgt. Der Programmierer schreibt eine Funktion oder Methode, damit diese Aktion ausgeführt werden kann. Ein Ereignis kann ein einzelnes Element der Benutzeroberfläche oder sogar ein HTML-Dokument sein. Ein Ereignis ist ein Element von Anwendungsinformationen aus einer zugrunde liegenden Programmbibliothek.[1]

Ereignisorientierte Programmierung

Ein Ansatz, um diese Problemsituation effizienter zu lösen, ist die ereignisorientierte Programmierung, die auf einer Inversion of Control basiert. D. h., es wird nicht mehr im Haupt-Kontrollfluss auf das Eintreten des Ereignisses gewartet (der Hauptkontrollfluss hat die Kontrolle), sondern dem Ereignis wird ein eigener Kontrollfluss zugeordnet (häufig realisiert als Thread), der eigenständig beim Eintreten des Ereignisses aktiv wird und Einfluss auf den Hauptkontrollfluss nehmen kann (siehe parallele Programmierung).

Technische Umsetzungen dieser Idee seit den 1960ern sind die Rückruffunktion (mit Event-spezifischem Unterprogramm) und (Hardware-)Interrupts, welche die Nachteile des Pollings vermeiden, dafür jedoch zwangsläufig die potentiellen Probleme des parallelen Programmierens hervorrufen.

Beschrieben werden können Ereignisbehandlungstechniken in Entwurfsmuster-Terminologie auch als Beobachter (Observer).

Verwendung

Das Konzept der Ereignisorientierten Programmierung eignet sich auch gut zur Implementierung von grafischen Benutzeroberflächen, wobei hier die Ereignisse meist Aktionen des Benutzers sind, wie zum Beispiel das Drücken einer Taste oder das Anklicken einer Schaltfläche. Ein anderes wichtiges Anwendungsfeld sind Computersimulationen, die so aufgebaut werden, dass Zustandsänderungen nur von Ereignissen ausgelöst werden, und ihrerseits Ereignisse auslösen (siehe ereignisorientierte Simulation).

Ereignisorientierte Programmierung lässt sich gut mit den Konzepten der objektorientierten Programmierung (OOP) kombinieren: Objekte definieren dann nicht mehr nur Eigenschaften und Methoden, sondern sind auch Ereignisquellen und bieten die Möglichkeit, die Ereignisbehandlung zu beeinflussen. Auch die Ereignisbehandlungsroutinen (englisch event handler, deutsch Ereignishandler) und die Ereignisse selbst werden dann als Objekte modelliert. Es kann jedoch argumentiert werden, dass über die Idee des entkoppelten Messagings zwischen Objektentitäten die ereignisorientierte Programmierung schon immer implizit ein Teilkonzept von OOP war.[2]

Ereignisse können je nach Programmierumgebung entweder nur eine Ereignisbehandlungsroutine (wie z. B. in Object Pascal) oder beliebig viele Ereignisbehandlungsroutinen (wie z. B. in Visual Basic, C# oder wie beim Signal-Slot-Konzept) aufrufen.

Es besteht die Möglichkeit, ein Ereignis als „verarbeitet“ zu kennzeichnen (consume). Nachfolgende Ereignisbehandler können dies abfragen und verzichten dann auf eine weitere Verarbeitung.

Beispiele

Beispiel zu Microsoft Access

Mit Microsoft Access können Benutzer kann u. a. Formulare und Berichte mit jeweils darin enthaltenen Feldern entwerfen. Zusätzlich gibt es Bereiche wie Formularkopf, Berichtskopf, Gruppenkopf und Gruppenfuß (je Gruppenstufe) und Detailbereich, die selbst wiederum Einzelfelder enthalten. Alle diese Begriffe sind Objekte.

Die Verarbeitung für Objekte ist aufgeteilt in funktionale Teileinheiten, deren Ausführung vom Eintritt bestimmter Ereignisse abhängig ist:

Definieren von Ereignissen in MS Access (2003)

In Formularen treten die Ereignisse im Wesentlichen durch Aktionen der Benutzeroberfläche auf: Mausereignisse und Eingaben, die von der Access Engine erkannt und behandelt werden. Mögliche Ereignisse sind zum Beispiel

  • bei Formularen: Öffnen, Anzeigen, vor Eingabe, Ändern, Löschen, Schließen
  • bei Formular-Eingabefeldern: wenn geändert, beim Berühren mit Mauszeiger, beim Klicken, beim Doppelklicken, bei Taste UP
  • bei Befehlsschaltflächen: beim Hingehen, beim Klicken, beim Doppelklicken

Bei Berichten initiiert die Engine die Ereignisse datenabhängig, ähnlich den Steuerungsprinzipien der normierten Programmierung. Mögliche Ereignisse sind (zum Beispiel):

  • für den ganzen Bericht: Beim Öffnen / Schließen, bei Seitenanfang, bei leeren Daten
  • für Berichtsbereiche wie Gruppenkopf und -fuß: beim Drucken, beim Formatieren

Zusätzlich zur Standardverarbeitung je Ereignistyp durch Microsoft Access kann der Programmierer für jedes Objekt und für jeden Ereignistyp festlegen, ob etwas Individuelles zu tun ist – und was. Zum Beispiel kann nach dem Ändern eines Eingabefelds eine bestimmte Prüfung vorgenommen werden. Beim Öffnen eines Berichts im Fall leerer Daten kann ein Fehlerhinweis angezeigt werden. Ein Gruppenfuß kann bei nur 1 Einzelzeile je Gruppe unsichtbar gemacht werden. Datenfelder können sichtbar oder unsichtbar gemacht oder mit bestimmten Inhalten ausgegeben werden.

Für solche Zusatzfunktionen legt der Programmierer, gegebenenfalls von einem Software-Assistenten unterstützt, eine Prozedur an, in der für das jeweilige Objekt und den jeweiligen Ereignistyp ein passender Code (in Visual Basic for Applications) hinterlegt wird (siehe Abbildung). Bei Eintreten des Ereignisses wird die entsprechende Prozedur ausgeführt. Ist keine Prozedur angelegt, wird das Ereignis in der definierten Grundform verarbeitet oder es erfolgt keine Verarbeitung (z. B. bei Berühren des Objekts mit dem Mauszeiger).

Implementierung eines Ereignissystems

Pseudocode

Der folgende Pseudocode soll eine einfache Implementierung eines Ereignissystems zeigen:

Function Event
  listener = []
  call = function()
    for each parallel (l in listener)
      l()

Anwendungsbeispiel:

Klick = new Event
Klick.listener.add(regenGeräusch)
Klick.listener.add(regenBild)
Klick()

JavaScript

Dieses einfache Ereignissystem bietet eine linear ablaufende Ereignisbehandlung und ermöglicht das An- und Abmelden von Ereignisbehandlungsroutinen. Für parallele Ausführung plant das World Wide Web Consortium sogenannte Web Workers. Das dargestellte Ereignissystem kann in der Programmiersprache JavaScript wie folgt verwendet werden:

Formular = function()
{
    this.send = new Event();
}

function sendToServer()
{
    alert("Die Anfrage wurde an den Server gesendet.");
}

function sayThankYou()
{
    alert("Vielen Dank für das Ausfüllen des Formulars.");
}

var umfrage = new Formular();
umfrage.send.addListener(this, "sendToServer");
umfrage.send.addListener(this, "sayThankYou");
umfrage.send();

C++

Das folgende Codebeispiel in Microsofts Variante der Programmiersprache C++ zeigt die Verwendung von Ereignisbehandlungsmethoden (englisch event handlers) und die Verknüpfung mit einem dazu passenden Ereignis. Für das Verknüpfen und Trennen der Ereignisse werden spezifische Funktionen in C++ verwendet. Ereignisattribute [event_source(native)] und [event_receiver(native)] in nativem C++ sind nicht mit Standard-C++ kompatibel. Um sie mit MSVC kompilieren zu können, muss der /permissive- Konformitätsmodus ausgeschaltet sein.[3] Mit anderen C++-Compilern funktioniert dieses Beispiel nicht.

#include <iostream>

using namespace std;

// Ereignisquellenklasse
[event_source(native)]
class EventSource
{
public:
    // Methodendeklaration, die die Ereignisbehandlungsmethoden (event handlers) als Ereignis deklariert
    __event void MyEvent(int count, int wordCount);
};

// Ereignisempfängerklasse
[event_receiver(native)]
class EventReceiver
{
public:
    // Ereignisbehandlungsmethode (event handler)
    // Sie hat dieselbe Methodensignatur wie das Ereignis MyEvent
    void MyEventHandler1(int count, int wordCount)
    {
        cout << "MyEventHandler1 asserts that Wikipedia is an important encyclopedia with " << count << " articles and " << wordCount << " words." << endl; // Ausgabe auf der Konsole
    }

    // Ereignisbehandlungsmethode (event handler)
    // Sie hat dieselbe Methodensignatur wie das Ereignis MyEvent
    void MyEventHandler2(int count, int wordCount)
    {
        cout << "MyEventHandler2 asserts that Uncyclopedia is a funny encyclopedia with " << count << " articles and " << wordCount << " words." << endl; // Ausgabe auf der Konsole
    }

    // Diese Methode verknüpft das Ereignis (Zeiger pEventSource) mit den Ereignisbehandlungsmethoden MyEventHandler1 und MyEventHandler2
    void hookEvent(EventSource* pEventSource)
    {
        // Aufrufe der intrinsischen C++ Funktion __hook
        __hook(&EventSource::MyEvent, pEventSource, &EventReceiver::MyEventHandler1);
        __hook(&EventSource::MyEvent, pEventSource, &EventReceiver::MyEventHandler2);
    }

    // Diese Methode trennt das Ereignis (Zeiger pSource) von den Ereignisbehandlungsmethoden MyEventHandler1 und MyEventHandler2
    void unhookEvent(EventSource* pEventSource)
    {
        // Aufrufe der intrinsischen C++ Funktion __unhook
        __unhook(&EventSource::MyEvent, pEventSource, &EventReceiver::MyEventHandler1);
        __unhook(&EventSource::MyEvent, pEventSource, &EventReceiver::MyEventHandler2);
    }
};

// Hauptfunktion die das Programm ausführt
int main()
{
    // Variablendeklaration für Ereignisquelle und Ereignisempfänger
    EventSource eventSource;
    EventReceiver eventReceiver;

    eventReceiver.hookEvent(&eventSource); // Aufruf der Methode hookEvent in der Klasse EventReceiver
     // Löst das Ereignis MyEvent aus. Dadurch werden die Ereignisbehandlungsmethoden MyEventHandler1 und MyEventHandler2 jeweils aufgerufen.
    __raise eventSource.MyEvent(1000000, 100000000);
    __raise eventSource.MyEvent(100000, 10000000);
    eventReceiver.unhookEvent(&eventSource); // Aufruf der Methode unhookEvent in der Klasse EventReceiver
     // Löst das Ereignis MyEvent aus. Die Ereignisbehandlungsmethoden werden nicht aufgerufen, weil das Ereignis in der Methode unhookEvent getrennt wurde.
    __raise eventSource.MyEvent(10000, 1000000);
}

Beim Ausführen der Funktion main wird folgender Text auf der Konsole ausgegeben:

MyEventHandler2 asserts that Uncyclopedia is a funny encyclopedia with 1000000 articles and 100000000 words.
MyEventHandler1 asserts that Wikipedia is an important encyclopedia with 1000000 articles and 100000000 words.
MyEventHandler2 asserts that Uncyclopedia is a funny encyclopedia with 100000 articles and 10000000 words.
MyEventHandler1 asserts that Wikipedia is an important encyclopedia with 100000 articles and 10000000 words.

Siehe auch

Einzelnachweise

  1. TechTarget: What is an event handler?
  2. Stefan Ram: Dr. Alan Kay on the Meaning of Object-Oriented Programming. fu-berlin.de, 23. Juli 2003, abgerufen am 4. Juni 2012 (englisch): „OOP to me means only messaging, local retention and protection and hiding of state-process, and extreme late-binding of all things.
  3. Microsoft: Event handling in native C++

Read other articles:

ルミナスウォリアー[1] 2017年金鯱賞欧字表記 Luminous Warrior[1]品種 サラブレッド[1]性別 牡[1]毛色 鹿毛[1]生誕 2011年2月9日(12歳)[1]登録日 2020年7月16日抹消日 2020年1月29日(JRA、1度目)[2]2020年4月16日(NAR)2021年1月13日(JRA、2度目)[3]2022年8月31日(NAR二度目)父 メイショウサムソン[1]母 ルミナスハッピー[1]母の父

 

French politician Guillaume-Isidore Baron de MontbelLithograph after a portrait by DaffingerBorn(1787-07-04)4 July 1787Toulouse, Haute-Garonne, FranceDied3 February 1861(1861-02-03) (aged 73)Schloss Frohsdorf, AustriaNationalityFrenchKnown forMinister of Finance Guillaume-Isidore Baron de Montbel (4 July 1787 – 3 February 1861) was a French politician who was a mayor of Toulouse, a deputy and a minister in the French government during the last year of the Bourbon Restoration. He w...

 

Ростислав Троненко Ім'я при народженні Ростислав Володимирович ТроненкоНародився 22 березня 1962(1962-03-22) (61 рік)СумиГромадянство  УкраїнаДіяльність дипломатAlma mater Київський університетПосада Надзвичайний та Повноважний Посол УкраїниТермін з 2012 до 2021Попередник Ігор Гр...

For the South Korean television series, see Bloody Romance (South Korean TV series). Chinese TV series or program Bloody RomancePromotional posterGenreFantasyAdventureRomanceBased onBloody Romanceby Banming BanmeiWritten byBanming BanmeiDirected byYi JunStarringLi YitongQu ChuxiaoCountry of originChinaOriginal languageMandarinNo. of seasons1No. of episodes36ProductionProducerZhang WeiProduction locationHengdian World StudiosRunning time45 minsProduction companiesYoukuMoon BlossomOriginal...

 

Ini adalah nama Tionghoa; marganya adalah Wu. Chien-Shiung WuChien-Shiung Wu pada 1958 di Columbia UniversityLahir(1912-05-31)31 Mei 1912Liuhe, Taicang, Jiangsu, Republik TiongkokMeninggal16 Februari 1997(1997-02-16) (umur 84)New York City, Amerika SerikatKebangsaanAmerika SerikatAlmamaterNational Central University University of California, BerkeleySuami/istriLuke Chia-Liu Yuan ​(m. 1942)​AnakVincent Yuan (袁緯承)Penghargaan Comstock Prize in Physics (196...

 

This article needs additional citations for verification. Please help improve this article by adding citations to reliable sources. Unsourced material may be challenged and removed.Find sources: List of cast members of the A Nightmare on Elm Street film series – news · newspapers · books · scholar · JSTOR (November 2009) (Learn how and when to remove this template message) Robert Englund portrayed Freddy Krueger throughout the first eight films of the ...

Protein-coding gene in the species Homo sapiens CPA2Available structuresPDBOrtholog search: PDBe RCSB List of PDB id codes1AYE, 1DTD, 1O6XIdentifiersAliasesCPA2, carboxypeptidase A2External IDsOMIM: 600688 MGI: 3617840 HomoloGene: 37541 GeneCards: CPA2 Gene location (Human)Chr.Chromosome 7 (human)[1]Band7q32.2Start130,266,863 bp[1]End130,289,798 bp[1]Gene location (Mouse)Chr.Chromosome 6 (mouse)[2]Band6|6 A3.3Start30,541,581 bp[2]End30,564,475 bp&#...

 

2011 American filmMachine Gun PreacherTheatrical release posterDirected byMarc ForsterScreenplay byJason KellerBased onAnother Man's War by Sam ChildersProduced byRobbie BrennerGary SafadyDeborah GiarratanaCraig ChapmanMark ForsterStarringGerard ButlerMichelle MonaghanMichael ShannonCinematographyRoberto SchaeferEdited byMatt ChesséMusic byAsche & SpencerProductioncompaniesApparatusSafady Entertainment1984 Private Defense ContractorsMpower PicturesVirgin ProducedDistributed byRelativity ...

 

NGC 7510   جزء من درب التبانة  الكوكبة الملتهب[1]  رمز الفهرس NGC 7510 (الفهرس العام الجديد)OCl 256 (Catalogue of Star Clusters and Associations)Collinder 454 (فهرس كوليندر)[2]C 2309+603 (كتالوج كالدويل)OCISM 55 (Catalog of open clusters and associated interstellar matter)[KPS2012] MWSC 3706 (Global survey of star clusters in the Milky Way. III. 139 new open clusters at high Galactic ...

En este artículo sobre fútbol y fútbol se detectaron varios problemas. Por favor, edítalo y/o discute los problemas en la discusión para mejorarlo: Necesita ser wikificado conforme a las convenciones de estilo de Wikipedia. Carece de fuentes o referencias que aparezcan en una fuente acreditada. Este aviso fue puesto el 14 de agosto de 2012. Del Bono Datos generalesNombre Club Del BonoApodo(s) BodegueroFundación 28 de enero de 1926 (97 años)Presidente Luis Salcedo Gara...

 

Type of webcomic A panel of a hypothetical sprite comic featuring graphics from The Battle for Wesnoth. Sprite comics are webcomics that consist primarily of computer sprites from video games. Art assets are ripped from various classic games such as Mega Man and Sonic the Hedgehog, are edited and combined by amateur cartoonists, and are posted on the internet. Popularized by Bob and George in the early 2000s, the style is considered relatively easy for beginning cartoonists to get involved in...

 

2010 live album by Various artistsThe Amazing ZigZag ConcertLive album by Various artistsReleased11 October 2010RecordedRoundhouse, London,28 April 1974GenreRock, pub rock, country rockLength4:08:01LabelRoad Goes on Forever Records – RGF/ZZBOX1974ProducerVic Maile (1974) Tony Poole (2010) The Amazing Zig Zag Concert was a rock concert held at The Roundhouse on April 28, 1974 to celebrate the fifth anniversary of Zig Zag Magazine. Described as one of the gigs of the decade,[1]...

1975 studio album by Ken McIntyreHomeStudio album by Ken McIntyreReleased1975RecordedJune 23, 1975Minot Sound Studios, White Plains, NYGenreJazzLength39:36LabelSteepleChaseSCS 1039ProducerNils WintherKen McIntyre chronology Hindsight(1974) Home(1975) Open Horizon(1975) Home is an album written and recorded by American jazz musician Ken McIntyre in 1975 under the SteepleChase label.[1][2][3] It features Jaki Byard, Reggie Workman, and Andrei Strobert. Reception ...

 

Irish Catholic synod in 1111 Map of dioceses in medieval Ireland The Synod of Ráth Breasail (or Rathbreasail; Irish: Sionad Ráth Bhreasail) was a synod of the Catholic Church in Ireland that took place in Ireland in 1111.[1] It marked the transition of the Irish church from a monastic to a diocesan and parish-based church. Many present-day Irish dioceses trace their boundaries to decisions made at the synod. Background Viking raids on Ireland began around the start of the 9th centur...

 

جيف شيغر   معلومات شخصية الميلاد 1 ديسمبر 1943 (80 سنة)  بروكلين  مواطنة الولايات المتحدة  عضو في الأكاديمية الوطنية للعلوم،  والأكاديمية الأمريكية للفنون والعلوم،  وجمعية الرياضيات الأمريكية[1][2]  الحياة العملية المدرسة الأم جامعة هارفاردجامعة برنس...

Marketplace in Dhaka, Bangladesh Hatirpool Bazar at Night Hatirpool is a busy marketplace in Dhaka, Bangladesh. It is a crowded area, with shopping complexes, hotel & restaurants, and market. The name 'Hatirpool' evolved from the British name of 'Hartlepool'.[1] Etymology Hatirpool has an ancient history. The Bhawal Raja used to keep his tame elephants at Pilkhana. The elephants were taken to the wetlands through the Elephant Road and Hatirpool. There was a pool for transportation...

 

Parroquia de San Marcos Evangelista San Marcos  Patrimonio de la Humanidad (parte de «Centro histórico de Puebla», n.º ref. 416) (1987) LocalizaciónPaís MéxicoDivisión PueblaSubdivisión Municipio de PueblaLocalidad Puebla de los ÁngelesDirección Av. de la Reforma №730, Barrio de San Pablo de los Frailes 72090Coordenadas 19°02′52″N 98°12′16″O / 19.0476435, -98.2044979Información religiosaCulto CatólicoArquidiócesis Arquidiócesis de Puebla de los ...

 

Summary of lunar material samples stolen or misplaced Sample from NASA's lunar surface collection at Johnson Space Center's vault in Houston, Texas Of the 270 Apollo 11 Moon rocks and the Apollo 17 Goodwill Moon Rocks that were given to the nations of the world by the Nixon Administration, approximately 180 are unaccounted for. Many of these rocks that are accounted for have been locked away in storage for decades. The location of the rocks has been tracked by researchers and hobbyists becaus...

2019 filmThe SharksPosterSpanishLos Tiburones Directed byLucía GaribaldiWritten byLucía GaribaldiProduced byIsabel GarcíaPancho Magnou ArnábalStarringRomina BentancurFederico MorosiniFabián ArenillasValeria LoisAntonella AquistapacheCinematographyGerman NocellaEdited bySebastián SchjaerMusic byFabrizio RossiMiguel RecaldeProductioncompanyMontelona CineRelease date January 2019 (2019-01) (Sundance)[1] Running time83 minutesCountriesUruguayArgentinaSpainLanguageSpani...

 

Cet article est une ébauche concernant une gare et la Hongrie. Vous pouvez partager vos connaissances en l’améliorant (comment ?) selon les recommandations des projets correspondants. Rákospalota-Kertváros Localisation Pays Hongrie Commune Budapest Quartier Rákospalota (15e arr.) Coordonnées géographiques 47° 34′ 40″ nord, 19° 07′ 20″ est Gestion et exploitation Exploitant Magyar Államvasutak (MÁV) Code UIC 55409151 Caractéristiques Lig...

 

Strategi Solo vs Squad di Free Fire: Cara Menang Mudah!