Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
Pascal - programmazione ad eventi
Forum - Pascal - programmazione ad eventi

Avatar
Ocentral (Normal User)
Pro


Messaggi: 86
Iscritto: 25/12/2009

Segnala al moderatore
Postato alle 15:17
Giovedì, 04/03/2010
scusate ma in pascal è possibie la programmazione ad eventi come quella di lazarus?
se si come?


grazie

PM Quote
Avatar
TheKaneB (Member)
Guru^2


Messaggi: 1792
Iscritto: 26/06/2009

Segnala al moderatore
Postato alle 10:49
Venerdì, 05/03/2010
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):

Codice sorgente - presumibilmente VB.NET

  1. == Listener ==
  2. mainloop():
  3. - loop
  4.   - foreach (evento in listaEventi) do
  5.     - if evento->occurred()
  6.       - dispatcher->raise( evento )
  7.   - next
  8.   - dispatcher->process() // se siamo su thread separati, questo comando non serve
  9. - repeat
  10.  
  11. register( evento ):
  12. - if evento not in listaEventi
  13.   - listaEventi->add( evento )
  14.  
  15. == Dispatcher ==
  16. raise( evento ):
  17.   - handler = evento->handler
  18.   - scheduler->add( handler )
  19.  
  20. process(): // se siamo su thread separati, inserire in un loop infinito questi comandi
  21.   - foreach (job in scheduler) do
  22.     - job->doWork()
  23.     - scheduler->remove( job )
  24.   - next
  25.  
  26. == Handler ==
  27. // Creo e impacchetto le informazioni necessarie per gestire l'evento
  28. main():
  29. - new evento
  30. // NOTA: "this" potrebbe essere un record, una classe, o una struct
  31. // l'importante è poter memorizzare dei puntatori a funzione nei suoi membri
  32. // PS: In un linguaggio OOP si può ottenere lo stesso risultato ereditando da una classe
  33. // Handler virtuale ed implementando i metodi doWork() e occurred(), anzichè storare
  34. // dei puntatori a funzione
  35. - evento->handler = this
  36. - evento->doWork = this->someFunction
  37. - evento->occurred = this->eventOccurredChecker
  38. - listener->register( evento )
  39. - listener->mainloop() // se usiamo thread diversi, questo loop dovrà girare su un thread apposito, lo stesso vale per il "process" del dispatcher
  40.  
  41. // Il gestore vero e proprio
  42. someFunction():
  43. - MessageBox("Chupa")
  44.  
  45. // funzione booleana che controlla se l'evento si è verificato
  46. eventOccurredChecker():
  47. - if mouse->isOver(button1) AND mouse->leftClicked
  48.   - return TRUE
  49. - else
  50.   - return FALSE



That's all folks... :)

Ultima modifica effettuata da TheKaneB il 05/03/2010 alle 11:00
PM Quote
Avatar
Ocentral (Normal User)
Pro


Messaggi: 86
Iscritto: 25/12/2009

Segnala al moderatore
Postato alle 21:00
Venerdì, 05/03/2010
La ringrazio

PM Quote