Funzione di callback in C ++

Funzione di callback in C ++

Una funzione di callback è una funzione, che è un argomento, non un parametro, in un'altra funzione. L'altra funzione può essere chiamata funzione principale. Quindi sono coinvolte due funzioni: la funzione principale e la funzione di callback stessa. Nell'elenco dei parametri della funzione principale, è presente la dichiarazione della funzione di callback senza la sua definizione, così come sono presenti dichiarazioni di oggetti senza assegnazione. La funzione principale è chiamata con argomenti (in main ()). Uno degli argomenti nella chiamata della funzione principale è la definizione effettiva della funzione di callback. In C ++, questo argomento è un riferimento alla definizione della funzione di callback; Non è la definizione effettiva. La stessa funzione di callback è effettivamente chiamata all'interno della definizione della funzione principale.

La funzione di callback di base in C ++ non garantisce un comportamento asincrono in un programma. Il comportamento asincrono è il vero vantaggio dello schema delle funzioni di callback. Nello schema di funzioni di richiamata asincrona, il risultato della funzione principale dovrebbe essere ottenuto per il programma prima che si ottenga il risultato della funzione di callback. È possibile farlo in C ++; Tuttavia, C ++ ha una biblioteca chiamata Future per garantire il comportamento dello schema di funzioni di callback asincrono.

Questo articolo spiega lo schema della funzione di callback di base. Molto è con puro c++. Per quanto riguarda il callback, viene anche spiegato il comportamento di base della futura biblioteca. La conoscenza di base di C ++ e dei suoi puntatori è necessaria per la comprensione di questo articolo.

Contenuto dell'articolo

  • Schema di funzione di callback di base
  • Comportamento sincrono con funzione di callback
  • Comportamento asincrono con funzione di callback
  • Uso di base della futura biblioteca
  • Conclusione

Schema di funzione di callback di base

Uno schema di funzioni di callback necessita di una funzione principale e la funzione di callback stessa. La dichiarazione della funzione di callback fa parte dell'elenco dei parametri della funzione principale. La definizione della funzione di callback è indicata nella funzione funzione della funzione principale. La funzione di callback è effettivamente chiamata nella definizione della funzione principale. Il seguente programma illustra questo:

#includere
Utilizzo dello spazio dei nomi std;
int Principalfn (char ch [], int (*ptr) (int))

int id1 = 1;
int id2 = 2;
int idr = (*ptr) (id2);
cout<<"principal function: "<<
id1<<"<restituire id1;

int cb (int iden)

cout<<"callback function"<<'\n';
restituire iden;

int main ()

int (*ptr) (int) = &cb;
char cha [] = "e";
Principalfn (CHA, CB);
restituzione 0;

L'output è:

funzione di callback
Funzione principale: 1 e 2

La funzione principale è identificata da Principalfn (). La funzione di callback è identificata da cb (). La funzione di callback è definita al di fuori della funzione principale ma effettivamente chiamata all'interno della funzione principale.

Nota la dichiarazione della funzione di callback come parametro nell'elenco dei parametri della Dichiarazione della funzione principale. La dichiarazione della funzione di callback è "int (*ptr) (int)". Nota l'espressione della funzione di callback, come una chiamata di funzione, nella definizione della funzione principale; Qualsiasi argomento per la funzione di funzione di callback viene approvato lì. La dichiarazione per questa chiamata è:

int idr = (*ptr) (id2);

Dove id2 è un argomento. PTR fa parte del parametro, un puntatore, che sarà collegato al riferimento della funzione di callback nella funzione principale ().

Nota l'espressione:

int (*ptr) (int) = &cb;

Nella funzione principale (), che collega la dichiarazione (senza definizione) della funzione di callback al nome della definizione della stessa funzione di callback.

La funzione principale è chiamata, nella funzione principale (), come:

Principalfn (CHA, CB);

Dove Cha è una stringa e CB è il nome della funzione di callback senza alcun argomento.

Comportamento sincrono della funzione di callback

Considera il seguente programma:

#includere
Utilizzo dello spazio dei nomi std;
void Principalfn (void (*ptr) ())

cout<<"principal function"<<'\n';
(*ptr) ();

void cb ()

cout<<"callback function"<<'\n';

void fn ()

cout<<"seen"<<'\n';

int main ()

void (*ptr) () = &cb;
Principalfn (CB);
fn ();
restituzione 0;

L'output è:

funzione principale
funzione di callback
visto

C'è una nuova funzione qui. Tutta la nuova funzione fa è visualizzare l'output, "visto". Nella funzione principale (), viene chiamata la funzione principale, quindi la nuova funzione, fn () è chiamata. L'output mostra che il codice per la funzione principale è stato eseguito, quindi per la funzione di callback è stato eseguito e infine che per la funzione FN () è stato eseguito. Questo è un comportamento sincrono (a thread).

Se si trattava di un comportamento asincrono, quando vengono chiamati tre segmenti di codice in ordine, il primo segmento di codice può essere eseguito, seguito invece dall'esecuzione del terzo segmento di codice, prima che il secondo segmento di codice venga eseguito.

Bene, la funzione, fn () può essere chiamata all'interno della definizione della funzione principale, anziché dall'interno della funzione principale (), come segue:

#includere
Utilizzo dello spazio dei nomi std;
void fn ()

cout<<"seen"<<'\n';

void Principalfn (void (*ptr) ())

cout<<"principal function"<<'\n';
fn ();
(*ptr) ();

void cb ()

cout<<"callback function"<<'\n';

int main ()

void (*ptr) () = &cb;
Principalfn (CB);
restituzione 0;

L'output è:

funzione principale
visto
funzione di callback

Questa è un'imitazione del comportamento asincrono. Non è un comportamento asincrono. È ancora un comportamento sincrono.

Inoltre, l'ordine di esecuzione del segmento di codice della funzione principale e il segmento di codice della funzione di callback può essere scambiato nella definizione della funzione principale. Il seguente programma illustra questo:

#includere
Utilizzo dello spazio dei nomi std;
void Principalfn (void (*ptr) ())

(*ptr) ();
cout<<"principal function"<<'\n';

void cb ()

cout<<"callback function"<<'\n';

void fn ()

cout<<"seen"<<'\n';

int main ()

void (*ptr) () = &cb;
Principalfn (CB);
fn ();
restituzione 0;

L'output è ora,

funzione di callback
funzione principale
visto

Questa è anche un'imitazione del comportamento asincrono. Non è un comportamento asincrono. È ancora un comportamento sincrono. Il vero comportamento asincrono può essere ottenuto come spiegato nella sezione successiva o con la biblioteca, futuro.

Comportamento asincrono con funzione di callback

Lo schema di funzioni di callback asincrono di base è:

tipo output;
Tipo CB (tipo di output)

// affermazioni

Digitare PrincipalFN (tipo di input, tipo CB (tipo di output))

// affermazioni

Nota le posizioni dei dati di input e output nei diversi luoghi dello pseudo-codice. L'input della funzione di callback è il suo output. I parametri della funzione principale sono il parametro di input per il codice generale e il parametro per la funzione di callback. Con questo schema, una terza funzione può essere eseguita (chiamata) nella funzione principale () prima dell'output della funzione di callback (ancora nella funzione principale ()). Il seguente codice illustra questo:

#includere
Utilizzo dello spazio dei nomi std;
char *output;
void cb (char out [])

output = out;

void Principalfn (char input [], void (*ptr) (char [50])

(*ptr) (input);
cout<<"principal function"<<'\n';

void fn ()

cout<<"seen"<<'\n';

int main ()

char input [] = "funzione di callback";
void (*ptr) (char []) = &cb;
Principalfn (input, CB);
fn ();
cout<restituzione 0;

L'output del programma è:

funzione principale
visto
funzione di callback

In questo particolare codice, l'output e il dato di input sembrano essere lo stesso dato. Il risultato della terza funzione di funzione nella funzione principale () è stato visualizzato prima del risultato della funzione di callback. La funzione di callback eseguita, finita e assegnata al suo risultato (valore) alla variabile, output, consentendo al programma di continuare senza la sua interferenza. Nella funzione principale (), è stato utilizzato l'output della funzione di callback (lettura e visualizzata) quando era necessario, portando a un comportamento asincrono per l'intero schema.

Questo è il modo a thread singolo per ottenere una funzione di callback comportamento asincrono con puro c++.

Uso di base della futura biblioteca

L'idea dello schema della funzione di callback asincrono è che la funzione principale restituisce prima che la funzione di callback ritorni. Questo è stato fatto indirettamente, efficacemente, nel codice sopra.

Nota dal codice sopra che la funzione di callback riceve l'ingresso principale per il codice e produce l'output principale per il codice. La libreria C ++, Future, ha una funzione chiamata Sync (). Il primo argomento a questa funzione è il riferimento alla funzione di callback; Il secondo argomento è l'input per la funzione di callback. La funzione Sync () restituisce senza attendere il completamento dell'esecuzione della funzione di callback, ma consente alla funzione di callback di completare. Ciò fornisce un comportamento asincrono. Mentre la funzione di callback continua a eseguire, poiché la funzione Sync () è già restituita, le istruzioni seguenti continuano a eseguire. Questo è come un comportamento asincrono ideale.

Il programma di cui sopra è stato riscritto di seguito, prendendo in considerazione la funzione Future Library e la sua sincronizzazione ():

#includere
#includere
#includere
Utilizzo dello spazio dei nomi std;
futuro produzione;
stringa cb (string stri)

restituire stri;

void Principalfn (input stringa)

output = async (CB, input);
cout<<"principal function"<<'\n';

void fn ()

cout<<"seen"<<'\n';

int main ()

string input = string ("funzione di callback");
Principalfn (input);
fn ();
String ret = output.Ottenere(); // attende che il callback torni se necessario
cout<restituzione 0;

La funzione Sync () memorizza infine l'output della funzione di callback nell'oggetto futuro. L'output previsto può essere ottenuto nella funzione principale (), utilizzando la funzione membro get () dell'oggetto futuro.

Conclusione

Una funzione di callback è una funzione, che è un argomento, non un parametro, in un'altra funzione. Uno schema di funzioni di callback necessita di una funzione principale e la funzione di callback stessa. La dichiarazione della funzione di callback fa parte dell'elenco dei parametri della funzione principale. La definizione della funzione di callback è indicata nella funzione funzione della funzione principale (in main ()). La funzione di callback è effettivamente chiamata nella definizione della funzione principale.

Uno schema di funzioni di callback non è necessariamente asincrona. Per essere sicuri che lo schema della funzione di callback sia asincrono, effettuare l'input principale al codice, l'input per la funzione di callback; Effettuare l'output principale del codice, l'output della funzione di callback; Archivia l'output della funzione di callback in una struttura variabile o dati. Nella funzione principale (), dopo aver chiamato la funzione principale, eseguire altre dichiarazioni dell'applicazione. Quando è necessario l'output della funzione di callback, nella funzione principale (), usa (leggi e visualizza) lì e poi.