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);