Oppure

Loading
04/03/10 14:17
Ocentral
scusate ma in pascal è possibie la programmazione ad eventi come quella di lazarus?
se si come?


grazie
aaa
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):

== 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
05/03/10 20:00
Ocentral
La ringrazio
aaa