05/03/10 9:49
TheKaneB
la programmazione ad eventi è una tecnica che puoi implementare in qualsiasi linguaggio di programmazione semidecente.
La tecnica di base consiste nello strutturare il programma in (almeno) 3 componenti distinti:
- Listener
- Dispatcher
- Handlers
Volendo, non è nemmeno necessario farli girare su thread diversi. Vediamo come funziona (in pseudocodice):
That's all folks...
La tecnica di base consiste nello strutturare il programma in (almeno) 3 componenti distinti:
- Listener
- Dispatcher
- Handlers
Volendo, non è nemmeno necessario farli girare su thread diversi. Vediamo come funziona (in pseudocodice):
== Listener == mainloop(): - loop - foreach (evento in listaEventi) do - if evento->occurred() - dispatcher->raise( evento ) - next - dispatcher->process() // se siamo su thread separati, questo comando non serve - repeat register( evento ): - if evento not in listaEventi - listaEventi->add( evento ) == Dispatcher == raise( evento ): - handler = evento->handler - scheduler->add( handler ) process(): // se siamo su thread separati, inserire in un loop infinito questi comandi - foreach (job in scheduler) do - job->doWork() - scheduler->remove( job ) - next == Handler == // Creo e impacchetto le informazioni necessarie per gestire l'evento main(): - new evento // NOTA: "this" potrebbe essere un record, una classe, o una struct // l'importante è poter memorizzare dei puntatori a funzione nei suoi membri // PS: In un linguaggio OOP si può ottenere lo stesso risultato ereditando da una classe // Handler virtuale ed implementando i metodi doWork() e occurred(), anzichè storare // dei puntatori a funzione - evento->handler = this - evento->doWork = this->someFunction - evento->occurred = this->eventOccurredChecker - listener->register( evento ) - listener->mainloop() // se usiamo thread diversi, questo loop dovrà girare su un thread apposito, lo stesso vale per il "process" del dispatcher // Il gestore vero e proprio someFunction(): - MessageBox("Chupa") // funzione booleana che controlla se l'evento si è verificato eventOccurredChecker(): - if mouse->isOver(button1) AND mouse->leftClicked - return TRUE - else - return FALSE
That's all folks...
Ultima modifica effettuata da TheKaneB 05/03/10 10:00
aaa