PDA

Visualizza la versione completa : [C/C++]: Event Driven Programming


Lotti
21-09-2006, 12:24
salve a tutti :)

premetto che ho cercato sulla rete ma non si trovano tanti esempi e quei 2 che si trovano non si compilano manco a pagare l'oro :)

premetto anche che mi serve del codice per compilatore g++ e simili. quindi niente GUI&Microsoft. anzi il tutto deve essere compilato con le librerie del nintendo ds (devkitpro)..

cmq non importa perchè deve essere un codice più generale possibile in grado di funzionare con qualsiasi compilatore.

so più o meno bene come funziona la programmazione a eventi perchè l'ho usata con java, con visual basic, con delphi ma li è facile! è tutto già programmato! basta inserire il codice nelle routine dei click oppure implementare l'interfaccia giusta (nel java) e registrare il componente.

nel caso del c++ si potrebbe fare un ciclo infinito e buttarci dentro un po' di if o switch per gestire i vari eventi.. questa però è una programmazione a oggetti di basso livello..

bene, io vorrei fare una cosa del genere con il c++. un gestore degli eventi completamente personalizzabile (devo fare in modo che reagisca alla pressione dei tasti, del touchscreen, del microfono, magari dell'audio.. quindi devo avere la possibilità di modificare tutto) strutturato come una "superclasse" che sia possibile ereditare per creare sottoclassi in grado di eseguire una precisa routine al verificarsi di un preciso evento (più o meno nello stesso modo in cui funziona il java).

ho trovato solo 2 esempi che sembrano validi, su internet, ma non riesco a compilarli..
1-->http://codeproject.com/cpp/static-callbacks.asp
2-->http://msdn.microsoft.com/msdnmag/issues/06/02/CAtWork/ http://msdn.microsoft.com/msdnmag/issues/06/03/CAtWork/

se non sbaglio le wxWidgets hanno una gestione degli eventi più o meno come quella da me descritta.. se avete familiarità con queste librerie grafiche cercate un po' come funziona la gestione degli eventi :P

voi cosa dite?

oregon
21-09-2006, 12:29
Che l'obiettivo mi sembra un po' troppo ambizioso ...

("... devo fare in modo che reagisca alla pressione dei tasti, del touchscreen, del microfono, magari dell'audio.. quindi devo avere la possibilità di modificare tutto ...")

Lotti
21-09-2006, 12:45
scusami se mi permetto, ma sul java e sul visual qualsiasiversione c'è un preciso evento per ogni singola minchiata.. perchè non posso farlo anche io?

newbie
21-09-2006, 18:14
Originariamente inviato da Lotti
scusami se mi permetto, ma sul java e sul visual qualsiasiversione c'è un preciso evento per ogni singola minchiata.. perchè non posso farlo anche io?

Dipende da cosa vuoi fare... dato che in C++ non mi sembra che esista il supporto nativo per gli eventi. L'unica possibilità è creare un oggetto (magari un thread) che, con un ciclo infinito di polling, controlli di continuo se è successo quello che ti serve sapere (che ne so, se è stato premuto un pulsante del mouse, o del joystick...), e, quando succede, generi gli eventi all'esterno.
In altre parole:
[list=1]
Supponiamo che un oggetto A debba ricevere gli eventi da un oggetto B che, ad esempio, ascolta il joystick. Supponiamo anche, per comodità, che la procedura di evento in A sia static (altrimenti vanno usati i puntatori a metodo).
In un file da includere per primo, crea un puntatore a funzione del tipo
"void (*EvTasto)(int tasto);"
Nel sorgente di B, scrivi la tua procedura di evento, come si fa in VB:

static void TastoPremuto(int qualeTasto){......}

Nel sorgente di A, crea una variabile

EvTasto ev;

e un metodo

public void Registra(EvTasto e){ev = e;}

che informi A di quale sia la procedura da chiamare quando viene premuto un tasto

oltre ovviamente al ciclo

while(1)
{
//controlla stato joystick...
if(è stato premuto un tasto t)
ev(t); //richiama la procedura di evento esterna
}
Nel sorgente di B, se ogA è l'istanza di A, scrivi la riga

ogA.Registra(TastoPremuto);

che passa ad A l'indirizzo della procedura di evento.
E il gioco è fatto!
[/list=1]
Ovviamente c'è da lavorarci un pochino... ma ci si fanno cose interessanti :D

Lotti
21-09-2006, 18:23
oh finalmente :) hai parlato di thread con un ciclo apparte che fa il suo sporco lavoro e un altro oggetto che nello stesso tempo riceve informazioni dal quel ciclo..

oh! però! non so niente di thread :) conosco solo le classi (eriditarietà e polimorfismo..).

tenterò di utilizzare la tua spiegazione, ma non è che potresti gentilmente farmi trovare un mini programmino che stampa "ciao" se premi un tasto specifico della tastiera per esempio?

se non ce la fai/non ti va non ti preoccupare :) grazie

MItaly
21-09-2006, 18:38
Originariamente inviato da newbie
Dipende da cosa vuoi fare... dato che in C++ non mi sembra che esista il supporto nativo per gli eventi.
Ehm... la maggior parte dei programmi Windows (e quindi event-driven) sono scritti in C quindi dire che non c'è supporto per gli eventi è un po' azzardato... il supporto per la gestione degli eventi c'è eccome, solo che essendo il C multipiattaforma che non c'è un supporto per la gestione di eventi specifici di una piattaforma; in Windows ad esempio mormalmente si usa una windows procedure che viene chiamata automaticamente dal sistema ogni evento che si verifica (metodo "standard" usato in tutti i programmi Windows, scritti in qualunque linguaggio di programmazione). Sia le windows procedure sia gli eventi personalizzati vengono implementati con puntatori a funzione, come hai spiegato poco sopra.
In ogni caso secondo me è bene documentarsi accuratamente su come funzionano i programmi per il Nintendo DS, perché mi pare strano che non ci sia già un qualche SDK che semplifica un po' la questione...

Lotti
21-09-2006, 18:58
le sdk ci stanno eccome devkitpro e palib attualmente.

il problema è che non voglio programmare a eventi a basso livello.

cioè un ciclo while infinito alla fine di ogni funzione e buttarci dentro tutti gli algoritmi per la gestione degli input. vorrei farlo con un gestore degli eventi ^_^

MItaly
21-09-2006, 19:11
Scusa, gli eventi che tu chiami "di basso livello" di solito sono pensati in maniera da risultare il più comodo possibile per gli sviluppatori... inoltre sono di solito la soluzione più efficiente rispetto a thread che continuano a fare loop, perché gli eventi sono solitamente procedure del tuo programma richiamate direttamente dal sistema operativo, che le richiama solo quando ce n'è effettivamente bisogno. In questa maniera sprechi il minimo dei cicli di CPU, lasciando il resto al sistema (che si occuperà di commutare i thread, gestire la memoria e simili).

MItaly
21-09-2006, 19:14
Tra l'altro se ci spieghi esattamente come funzionano gli eventi forniti dall'SDK possiamo darti qualche consiglio...

Lotti
21-09-2006, 20:05
gli eventi funzionano tutti così:

una struct o una funzione che restituisce 1 o 0..
per esempio per verificare se la freccia in su è premuta devo digitare

if(Pad.Held.Up)
{....}

Loading