Visualizzazione dei risultati da 1 a 2 su 2
  1. #1

    [C++ STD] Callback per eventi

    Salve gente!!!
    Allora, premetto che devo fare questo programma usando il C++ standard, quindi non tirate in ballo VisualC++m, Microsoft Borland o quantaltro...
    Vorrei realizzare un programma (di prova, per imparare) che gestisca le callback, cioe' gli eventi.
    Ora, so che agli eventi corrisponde una callback, solo che non so in che modo si lancino le callback, in che modo vengono gestite eccetera... in altre parole voglio riprogrettare le callback in un mio programma.

    Oggi un prof mi ha accennato questo argomento, e' saltato fuori che le callback non sono altro che messaggi che vengono inseriti dalle funzioni in un'area di momoria tipo stack.

    Ora, non so esattamente come funza, ma mi interessa di tutto e di piu'. Se avete informazioni relative all'argomento, postate.

    Grazie
    Sayounara
    #exclude <windows.h>
    Powered by Gentoo GNU/Linux
    Cos'e' l'impossibile se non una questione di tempo?
    Riesumare i post vecchi non e' sbagliato, e' una risposta o la continuazione di un thread. Meglio riesumare che creare di nuovi :]

  2. #2
    Le callback non sono messaggi, a meno che come messaggio non si intenda una funzione, ma nel linguaggio corrente non sono la stessa cosa.

    Sono funzioni utente richiamate da altre funzioni (di libreria, in genere) in risposta a certi eventi.

    Ad esempio Windows (ho detto Windows, non l'MFC o l'API) non comunca gli eventi tramite Callback, ma mediante i messaggi (che sono asincroni).

    un esempio di funzione callback nella libreria standard del C è la funzione compare in qsort

    Per fare una callback devi definire un puntatore ad una funzione e passarla come parametro a qualche altra funzione, che al verificarsi di un certo evento, richiama (callback) la funzione specificata come parametro.

    Esempio:

    Supponi di scrivere un albero binario di int.

    Ad esempio vuoi scrivere due funzioni, una che stampa su video tutto l'albero, e una che moltiplica per due tutti gli elementi dell'albero.

    Potresti scrivere due funzioni ricorsive che attraversano l'albero e fanno il loro lavoro, ma così facendo duplicheresti tutta la parte di codice che serve ad attraversare l'albero, e se cambiassi l'implementazione interna dell'albero dovresti rivedere entrambe le funzioni, per non parlare del caso in cui le funzioni del genere possano essere 10, oppure del caso in cui tu voglia riusare quell'albero per altri programmi.

    Allora che fai?

    scrivi una funzione
    codice:
    void TraverseTree(TREE t, void(*cbkTraverse)(TREENODE n))
    {
         TREENODE n;
         if(!t)return;
         n = (TREENODE)t;
         TraverseTree((TREE)n->left, cbkTraverse);
         cbkTraverse(n); //evento: trovato un nodo dell'albero, callback
         TraverseTree((TREE)n->right, cbkTraverse);     
    }
    che attraversa tutto l'albero e per ogni nodo richiama la tua funzione cbkTraverse(TREENODE n);
    dopo tu scrivi le tue funzioni
    codice:
    void StampaAlbero(TREENODE n)
    {
        cout << n->value;
    }
    void Moltiplica(TREENODE n)
    {
        n->value *= 2;
    }
    ad un certo punto nel tuo codice deciderai di stampare a video l'albero e scriverai

    TraverseTree(t, StampaAlbero);

    poi deciderai di moltiplicarlo

    TraverseTree(t, Moltiplica);

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 © 2025 vBulletin Solutions, Inc. All rights reserved.