Scrivere una libreria esterna contenente una Funzione di Callback che chiama una Funzione Callback in Gambas

Da Gambas-it.org - Wikipedia.
Versione del 19 mag 2014 alle 08:38 di Vuott (Discussione | contributi) (Creata pagina con 'La "''Funzione Callback''" è una funzione, della quale viene passato mediante una variabile di tipo ''Puntatore'' l'indirizzo ad una funzione di libreria (''Funzione <SPAN st...')

(diff) ← Versione meno recente | Versione attuale (diff) | Versione più recente → (diff)

La "Funzione Callback" è una funzione, della quale viene passato mediante una variabile di tipo Puntatore l'indirizzo ad una funzione di libreria (Funzione di Callback) in modo tale che al momento previsto questa Funzione di Callback della libreria possa chiamare la Funzione Callback, eventualmente anche passandole dei parametri.

Come sappiamo è possibile passare l'indirizzo di una Funzione CallBack di Gambas ad una Funzione di Callback presente in una libreria esterna. In questa pagina vedremo come scrivere un'apposita libreria esterna contenente una Funzione di Callback, alla quale viene passato l'indirizzo di una Funzione Callback presente nel codice dell'applicativo Gambas.


La libreria esterna, da noi scritta e che chiameremo libadhoc.c, sarà la seguente:

#include <unistd.h>


int (*po)(int);   // Dichiarazione del "Puntatore a Funzione"


void invia(void (*fp)) {    // Funzione di Callback

  int i;

  po = fp;   // Inizializzazione del "Puntatore a Funzione"
  
  while (1) {
  
/* Invoca la funzione callback di Gambas mediante il "Puntatore a Funzione"
e le passa il valore della variabile intera "i": */
    if ((i % 10) == 0)  (*po)(i);

    usleep(50000);
    
    i++;

  };

}

Il codice sorgente della libreria esterna, da noi scritta, verrà posto nella cartella Dati del progetto Gambas.


L'applicativo Gambas sarà invece il seguente:

Private Extern invia(ri As Pointer) In "/tmp/libadhoc"


Public Sub Main()

  Shell "gcc -o /tmp/libadhoc.so " & Application.Path &/ "libadhoc.c -shared -fPIC" Wait

  invia(riceve)

End



Private Function riceve(i As Integer)   ' Funzione Callback
 
  Print "Ricevuto: "; i
 
End