Hændelsesdrevet programmering

Den aktuelle version af siden er endnu ikke blevet gennemgået af erfarne bidragydere og kan afvige væsentligt fra den version , der blev gennemgået den 13. februar 2016; checks kræver 15 redigeringer .

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 .

Omfang

Hændelsesdrevet programmering bruges generelt i tre tilfælde:

  1. ved opbygning af brugergrænseflader (inklusive grafiske );
  2. ved oprettelse af serverapplikationer i tilfælde af, at generering af serviceprocesser af en eller anden grund er uønsket ;
  3. ved programmering af spil, hvor mange objekter styres.

Applikationer i serverapplikationer

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.

Multiplexing

Følgende operativsystemværktøjer kan bruges til at multiplekse forbindelser:

Implementeringseksempler

Applikationer i desktop-applikationer

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.

Programmeringssprog

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 .

Værktøjer og biblioteker

  • Node.js , en begivenhedsdrevet I/O - ramme baseret på V8 JavaScript -motoren
  • Cocoa & Objective-C , et reflekterende objektorienteret programmeringssprog, der tilføjer Smalltalk -stil beskeder til C-sproget .
  • GLib
  • Gui4Cli [4] , et hændelsesdrevet programmeringssprog til Windows
  • libsigc++
  • livlig
  • POCO
  • libasync , en del af sfs og sfslite [5] bibliotekerne, et effektivt begivenhedsbibliotek til C++
  • Perl Objektmiljø
  • AnyEvent, EV - Perl-moduler til begivenhedsdrevet programmering
  • PRADO, et begivenhedsdrevet komponentværktøj til webprogrammering i PHP 5
  • tcl
  • Twisted , Python
  • Qt , et C ++- widgetbibliotek på tværs af platforme baseret på hændelsesstyringsmodellen. Der er en mindre version kaldet Qt/Console, der fjerner widget-understøttelseskoden og er en hændelsesdrevet ramme, der også inkluderer nogle ekstra funktioner såsom netværk på tværs af platforme, multithreading og XML -manipulation .
  • QP  er en familie af åbne begivenhedsdrevne miljøer til indlejrede realtidssystemer [6]
  • Simple Unix Events aka SUE [7] , et simpelt objektorienteret bibliotek til at bygge begivenhedsorienterede Unix -programmer i C++ .

Se også

Engelsksprogede kilder

Materialer på russisk

Links

  1. Linux-Kernel Archive: Re: Alan Cox-citat? (var: Vedr.: regnskab (link ikke tilgængelig) . Hentet 29. april 2008. Arkiveret fra originalen 8. februar 2008. 
  2. N. N. Nepeyvoda. 13. Foredrag: Eventprogrammering // Programmeringsstile og -metoder. foredragskursus. studievejledning . - M . : Internet University of Information Technologies, 2005. - S. 213-222. — 316 s. — ISBN 5-9556-0023-X . Arkiveret 28. januar 2012 på Wayback Machine
  3. S.V. Zykov. Forelæsninger №15 og №16 // Introduktion til programmeringsteori. Objektorienteret tilgang . — Internet University of Information Technologies. Arkiveret 13. april 2011 på Wayback Machine
  4. Gui4Cli hjemmeside . Hentet 1. juli 2011. Arkiveret fra originalen 9. juli 2011.
  5. sfslite: oversigt (downlink) . Dato for adgang: 22. januar 2008. Arkiveret fra originalen 29. marts 2010. 
  6. Download fra Quantum Leaps . Hentet 22. januar 2008. Arkiveret fra originalen 8. juli 2008.
  7. Hjemmesiden til biblioteket Simple Unix Events (SUE) . Dato for adgang: 1. juli 2011. Arkiveret fra originalen den 29. marts 2010.