Hændelsesdrevet programmering ( eng. hændelsesdrevet programmering ; herefter SOP) er et programmeringsparadigme , hvor programudførelse er bestemt af hændelser - brugerhandlinger (tastatur, mus, berøringsskærm), beskeder fra andre programmer og tråde, operativsystemhændelser ( for eksempel modtagelse af en netværkspakke ).
SOP kan også defineres som en måde at konstruere et computerprogram i, hvor hovedapplikationsløkken er eksplicit allokeret i koden (normalt i programmets hovedfunktion) , hvis krop består af to dele: hændelseshentning og hændelsesbehandling .
Som regel er det i virkelige opgaver uacceptabelt at køre en hændelseshandler i lang tid, da programmet i dette tilfælde ikke kan reagere på andre hændelser. I denne forbindelse bruges der ofte automatisk programmering ved skrivning af hændelsesdrevne programmer .
Hændelsesdrevet programmering bruges generelt i tre tilfælde:
Hændelsesdrevet programmering bruges i serverapplikationer til at løse problemet med at skalere til 10.000 samtidige forbindelser eller mere.
I servere bygget i henhold til modellen "én tråd pr. forbindelse" opstår der skalerbarhedsproblemer af følgende årsager:
En filosofisk forudsætning for at opgive streamingmodellen af servere kan være Alan Cox' udsagn : "En computer er en statsmaskine . Flowprogrammering er for dem, der ikke ved, hvordan man programmerer tilstandsmaskiner” [1] .
Serverapplikationen i hændelsesorienteret programmering er implementeret på et systemkald, der modtager hændelser samtidigt fra mange deskriptorer (multipleksing). Hændelseshåndtering bruger udelukkende ikke-blokerende I/O-operationer, så intet håndtag forstyrrer behandlingen af hændelser fra andre håndtag.
Følgende operativsystemværktøjer kan bruges til at multiplekse forbindelser:
I moderne programmeringssprog er hændelser og hændelseshåndtere centrale for implementeringen af en grafisk brugergrænseflade. Overvej for eksempel samspillet mellem et program og musebegivenheder. Et tryk på højre museknap udløser en systemafbrydelse, der kører en bestemt procedure i operativsystemet. Denne procedure søger efter vinduet under musemarkøren. Hvis der findes et vindue, sendes denne hændelse til vinduets beskedkø. Afhængigt af vinduestypen kan yderligere hændelser blive genereret. For eksempel, hvis et vindue er en knap (i Windows er alle grafiske elementer vinduer), så genereres der desuden en knapklik-hændelse. Forskellen på den sidste begivenhed er, at den er mere abstrakt, den indeholder nemlig ikke markørens koordinater, men siger blot, at der blev klikket på knappen.
En hændelseshandler kan se sådan ud (ved at bruge C# som eksempel):
privat void knap1_Klik ( objektafsender , EventArgs e ) { MessageBox . _ Vis ( "Knappen blev trykket" ); }Her er hændelseshandleren en procedure, som senderparameteren sendes til, som normalt indeholder en pointer til hændelseskilden. Dette giver dig mulighed for at bruge den samme procedure til at håndtere hændelser fra flere knapper, og skelne dem med denne parameter.
I C# er begivenheder implementeret som et sprogelement og er medlemmer af klasser. Hændelsesmekanismen her implementerer udgiver/abonnent -designmønsteret . Eksempel på hændelseserklæring:
public class MyClass { offentlig begivenhed EventHandler MyEvent ; }Hvor EventHandler er en delegeret , der specificerer typen af hændelseshåndteringsprocedure. Tilmelding til et arrangement foregår på følgende måde:
min klasse . MyEvent += ny EventHandler ( Handler );Her er myClass en instans af klassen MyClass , Handler er en handlerprocedure. En begivenhed kan have et ubegrænset antal handlere. Når en hændelseshandler tilføjes, tilføjes den til en speciel stak, og når en hændelse opstår, kaldes alle handlere i deres rækkefølge på stakken. Afmelding af en begivenhed, det vil sige sletning af en behandler, udføres på samme måde, men ved at bruge "-="-operatoren.
Forskellige programmeringssprog understøtter SOP'er i varierende grad. Følgende sprog har den mest komplette støtte til begivenheder (ikke-udtømmende liste):
Andre sprog understøtter for det meste begivenheder som undtagelseshåndtering .