Händelsedriven programmering ( eng. händelsedriven programmering ; härefter SOP) är ett programmeringsparadigm där programexekveringen bestäms av händelser - användaråtgärder (tangentbord, mus, pekskärm), meddelanden från andra program och trådar, operativsystemhändelser ( till exempel mottagande av ett nätverkspaket ).
SOP kan också definieras som ett sätt att konstruera ett datorprogram där huvudapplikationsslingan är explicit allokerad i koden (vanligtvis i programmets huvudfunktion) , vars kropp består av två delar: händelsehämtning och händelsebearbetning .
Som regel, i verkliga uppgifter, är det oacceptabelt att köra en händelsehanterare under lång tid, eftersom programmet i detta fall inte kan svara på andra händelser. I detta avseende, när man skriver händelsestyrda program, används ofta automatisk programmering .
Händelsestyrd programmering används vanligtvis i tre fall:
Händelsestyrd programmering används i serverapplikationer för att lösa problemet med skalning till 10 000 samtidiga anslutningar eller mer.
I servrar byggda enligt modellen "en tråd per anslutning" uppstår skalbarhetsproblem av följande skäl:
En filosofisk utgångspunkt för att överge strömningsmodellen för servrar kan vara Alan Cox' uttalande : "En dator är en tillståndsmaskin . Flödesprogrammering är till för dem som inte vet hur man programmerar tillståndsmaskiner” [1] .
Serverapplikationen i händelseorienterad programmering implementeras på ett systemanrop som tar emot händelser samtidigt från många deskriptorer (multiplexering). Händelsehantering använder uteslutande icke-blockerande I/O-operationer så att inget handtag stör behandlingen av händelser från andra handtag.
Följande operativsystemverktyg kan användas för att multiplexa anslutningar:
I moderna programmeringsspråk är händelser och händelsehanterare centrala för implementeringen av ett grafiskt användargränssnitt. Tänk till exempel på interaktionen mellan ett program och mushändelser. Att trycka på höger musknapp utlöser ett systemavbrott som kör en specifik procedur inom operativsystemet. Denna procedur söker efter fönstret under muspekaren. Om ett fönster hittas skickas denna händelse till fönstrets meddelandekö. Beroende på fönstertypen kan ytterligare händelser genereras. Till exempel, om ett fönster är en knapp (i Windows är alla grafiska element fönster), så genereras dessutom en knappklickshändelse. Skillnaden med den senaste händelsen är att den är mer abstrakt, den innehåller nämligen inte markörens koordinater, utan säger bara att knappen klickades.
En händelsehanterare kan se ut så här (med C# som exempel):
privat void button1_Click ( objektavsändare , EventArgs e ) { MessageBox . _ Visa ( "Knappen trycktes" ); }Här är händelsehanteraren en procedur till vilken avsändarparametern skickas, vanligtvis innehållande en pekare till händelsekällan. Detta gör att du kan använda samma procedur för att hantera händelser från flera knappar, och särskilja dem med denna parameter.
I C# implementeras händelser som ett språkelement och är medlemmar i klasser. Händelsemekanismen implementerar här designmönstret för utgivare/prenumeranter . Exempel på händelsedeklaration:
public class MyClass { public event EventHandler MyEvent ; }Där EventHandler är en delegat som anger typen av händelsehanterarprocedur. Att prenumerera på ett evenemang görs på följande sätt:
min klass . MyEvent += ny EventHandler ( Handler );Här är myClass en instans av klassen MyClass , Handler är en hanterarprocedur. En händelse kan ha ett obegränsat antal hanterare. När en händelsehanterare läggs till läggs den till i en speciell stack, och när en händelse inträffar anropas alla hanterare i sin ordning på stacken. Att avsluta prenumerationen på en händelse, det vill säga att ta bort en hanterare, utförs på liknande sätt, men med operatorn "-=".
Olika programmeringsspråk stödjer SOPs i varierande grad. Följande språk har det mest kompletta stödet för evenemang (icke uttömmande lista):
Andra språk stödjer för det mesta evenemang som undantagshantering .