Avagy, miért a farok csóválja a kutyát?
A korábbi fejezetekben, a nyomi programok világában a programunkról mindig tudtuk, hogy mit csinál.
Ezt nevezik lineáris végrehajtásnak (lineáris - "egy vonal menti", azaz előröl végéig).
Ehhez képest az előbb két fura dolgot is láttunk:
A programunk nem az elejétől a végéig fut. A programunk megcsinálja az ablakot, majd utána a listenerek fognak elindítani apró kis programrészleteket. Az pedig elsősorban a felhasználón múlik, hogy milyen gombra kattint, és mikor, így végül a felhasználón múlik, hogy a programunk kis darabkái milyen sorrendben hajtódnak végre.
Ezt nevezik esemény-orientált (event-driven) programnak, hiszen a program futását külső események vezérlik - a kattogtatások, a gombok megnyomása. A timer is külső eseménynek számít :)
Hogyan képzeld el?
Valójában, ez olyan, mintha a Kocsmában lenne egy Pultos, és minden Ember a Pultostól kér dolgokat. Lehet, hogy:
Hogyan "fagy le" a program?
Látszólag úgy tűnik, hogy Feri a Pultos mindenkit kiszolgál - és minden eseményre reagál. Azonban, ha Feritől olyat kérnek, aminek a teljesítéséhez sok idő kell, akkor gondok lesznek:
Amikor Feri ezt az eseményt megkapja, és nekilát végrehajtani, az el fog tartani 20 percig, és eközben Jim csodálkozni fog, hogy hiába is kéri a következő tévé csatornát, Feri nem válaszol!
Nyilván nem válaszol, mert Feri csak egy van, és ahhoz hogy mindenki boldog legyen, nem szabad olyat kérni tőle amihez túl sok idő kell, mert Feri egyszerre csak egy eseményt tud kezelni.
Ezért nagyon fontos, hogy listenerbe ne tegyünk olyan programkódot, aminek a végrehajtása sok időt vesz igénybe. Például, ha egy gombnyomásra neki kell látni lekérdezni egy giga nagy adatbázisból, hogy tavaly nyáron hányan voltak strandon - és ez a dolog 20 másodpercig tart - akkor 20 másodpercig használhatatlannak fog tűnni a programunk, hiszen semmilyen más eseményre nem reagál.
Sokan úgy ismerik ezt, hogy a program "lefagyott" - mert semmire sem reagál. Nos, ennek az oka egyszerű: valaki nem tartotta be a Ferit nem tartjuk fel szabályt.
Minden program nyelven, és minden operációs rendszerben event-driven az egeres-ablakos GUI, hiszen ezzel a módszerrel lehet hagyni, hogy a felhasználó tetszőleges sorrendben nyomogassa a gombokat, és így válassza ki, hogy a programunk melyik darabkája fusson a listenerek meghívásával. Bármely esetben ha Ferit feltartjuk, azt a gui bánja. (Később majd foglalkozunk vele, hogy hogyan lehet Feri helyett valaki mást elküldeni megcsinálni a hosszan tartó dolgokat.)