Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 12
  1. #1

    [C++] Event Driven Programming: how to?

    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?

  2. #2
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,462
    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 ...")

  3. #3
    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?

  4. #4
    Utente di HTML.it L'avatar di newbie
    Registrato dal
    Dec 2005
    Messaggi
    299
    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
    Svegliati, Neo. Matrix ti possiede...

  5. #5
    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

  6. #6
    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...
    Amaro C++, il gusto pieno dell'undefined behavior.

  7. #7
    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 ^_^

  8. #8
    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).
    Amaro C++, il gusto pieno dell'undefined behavior.

  9. #9
    Tra l'altro se ci spieghi esattamente come funzionano gli eventi forniti dall'SDK possiamo darti qualche consiglio...
    Amaro C++, il gusto pieno dell'undefined behavior.

  10. #10
    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)
    {....}

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.