Událostmi řízené programování ============================= - programy: dávkové, menu řízené nebo událostmi řízené - dávkové (batch) programy: inicializace, načtení dat, zpracování, výstup výsledků - vykonávání programu řízeno programátorem (procedurami, funkcemi), jednorázové provedení akce a konec - typ synchronního programování - jednoché udržovat historii a stav programu - vhodný model pro programy typu filtr (programy pro příkazovou řádku, CLI) nebo algoritmy - př. načti dvě čísla ze vstupu, sečti je a vypiš na výstup - událostmi řízené (even driven) - inicializace, čekání na událost (signál, že se něco stalo, blokující), asynchronní vznik a zaznamenání události, vyzvednutí události a zpracování události (reakce) - vykonávání programu řízeno událostmi - čekání na událost a její zpracování, konec jako reakce na událost - typ asynchronního programování - složitější udržovat historii a stav programu - události vyvolané uživatelskou, hardwarovou nebo programovou akcí (kliknutí, stisk klávesy, požadavek na navázání síťového spojení, přečtení z disku, událost programového časovače apod.) - programy většinou vícevláknové (popř. víceprocesové, i když není nutné) - standardní a vhodnější model pro interaktivní programy - př. opakuj: jestliže bylo na vstupu zadáno číslo (událost), ulož ho a pokud již byla zadána dvě, sečti je a vypiš na výstup (obsluha) - lze lépe generalizovat - ulož ho (obsluha), jestliže již byla zadána dvě čísla, ... (další obsluha) - základní princip tvorby GUI aplikací, ale také systémová, meziprocesní (popř. mezivláknová) a síťová komunikace pomocí zpráv, řídící systémy (události od sensorů) Řízení událostmi, architektura programu --------------------------------------- - událost se může skládat nebo být interpretována z událostí na nižší úrovni, např. výběr menu z kliknutí myši a to z přerušení od myši - vznik události (zaslání od OS nebo z programu samotného) a její zařazení do fronty událostí a zpráv - (asynchronní) vybrání události z fronty a zpracování (dispatch), ve smyčce událostí a zpráv (event loop, message dispatcher, u HW může být řešena přerušením) -- řídící část programu while run event = get_next_event() process_event() end while - objekty mají zaregistrovánu obsluhu události (event handler, callback funkce, mohou být víceúrovňové, od přerušení a signálů k událostem), která se zavolá s událostí jako parametrem - řešena jako metoda objektu definujícího a zachycujícího událost, anonymní vnitřní třída, delegát (?) - zpracování události obsluhou může vyvolat další událost(i) -- předávání informace mezi objekty - vzor řízení a chování programu, ne programovací paradigma - lib. jazyk, lepší vyšší, typicky objektové (objekt má definovány události a obsluhy), vývojářské nástroje mohou generovat kostru programu (smyčku), zjednodušovat tvorbu obsluh - podobné menu řízené - inicializace, výběr možnosti ze zužujícího se menu až do akce, výstup - může obsahovat smyčku, ale vykonávání řízeno programátorem (systémem menu) Souborové operace ----------------- - smyčka zpráv čekající na události na souborech (deskriptorech) pomocí select nebo poll while changeds = select(fds) { do_something(changed_fds) } - použití pro práci se soubory, meziprocesní a síťovou komunikaci, řízení zařízení Signály v UNIXu --------------- - asynchronní události pro meziprocesní komunikaci - obsluha přeruší aktuální kód, i čekání na souborovou operaci - kvůli race condition varianta pselect nebo self-pipe trik (převod signálu zápisem na událost na rouře) ADAPTIVE Communication Environment - obecná smyčka Reactor - synchronizace souborových událostí, časovačů a signálů GUI --- Typy událostí - uživatelské akce s okny a prvky GUI (změna velikosti, požadavek na překreslení, změna focusu, výběr, potvrzení apod.), klávesnicí (klávesy), myší (pohyb, kliknutí) - systémové akce (změna času, síťová aktivita) - programové akce (časovač, ruční vyvolání události) - ruční vyvolání: např. překreslení, NE, lepší invalidace oblasti a událost vyvolá GUI! Programování - definice obsluhy: přeregistrování výchozí, redefinice (po dědění objektu), vytvoření spec. funkcí z funkce/metody - registrace obsluhy vůči události: funkce (connect) - spuštění smyčky: nová main Řešení - grafická knihovna (toolkit) implementuje frontu a smyčku událostí a zpráv, také výchozí obsluhy - programátor po inicializaci vytváří objekty a obslužné funkce (funkcemi nebo subclassing - dědění, kontejnery), které registruje (mohou explicitně nebo implicitně volat také výchozí obsluhy), poté spustí smyčku - ukončení smyčky = konec programu (většinou) - někdy rozlišování událostí od objektů GUI (zpracovány synchronně) od grafického subsystému (klávesy, myš, překreslení okna, zpracovány asynchronně) Linux - X Window System, Xlib smyčka (XNextEvent) - GUI toolkity GTK (gtkmm, gtk#, GLib smyčka), Qt (Qt/Console), WxWindows - libsigc++ (používá ji gtkmm), libevent Více: http://eventdrivenpgm.sourceforge.net/