Differenze tra le versioni di "Scrivere una libreria esterna contenente una Funzione di Callback che chiama una Funzione Callback in Gambas"
(3 versioni intermedie di uno stesso utente non sono mostrate) | |||
Riga 2: | Riga 2: | ||
[[Extern:_richiamare_funzioni_esterne_a_Gambas#Funzione_esterna_che_fa_riferimento_ad_una_funzione_interna_Callback|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. | [[Extern:_richiamare_funzioni_esterne_a_Gambas#Funzione_esterna_che_fa_riferimento_ad_una_funzione_interna_Callback|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. | ||
− | |||
Facciamo qualche esempio. | Facciamo qualche esempio. | ||
− | |||
===Primo esempio=== | ===Primo esempio=== | ||
− | + | In questo esempio, la libreria esterna, da noi scritta in linguaggio C e che chiameremo ''libadhoc.c'' sarà inserita, per maggiore praticità, nel programma principale di Gambas. | |
Library "/tmp/libadhoc" | Library "/tmp/libadhoc" | ||
Riga 15: | Riga 13: | ||
− | + | Public Sub Main() | |
<FONT Color=gray>' ''Va a creare la nostra libreria condivisa esterna:''</font> | <FONT Color=gray>' ''Va a creare la nostra libreria condivisa esterna:''</font> | ||
Riga 23: | Riga 21: | ||
invia(<FONT Color=#B22222>riceve</font>) | invia(<FONT Color=#B22222>riceve</font>) | ||
− | + | End | |
− | + | Private Function <FONT Color=#B22222>riceve</font>(i As Integer) <FONT color=gray>' ''Funzione Callback''</font> | |
Print "Ricevuto: "; i | Print "Ricevuto: "; i | ||
− | + | End | |
− | + | Private Procedure Creaso() | |
File.Save("/tmp/libadhoc.c", "#include <unistd.h>" & | File.Save("/tmp/libadhoc.c", "#include <unistd.h>" & | ||
Riga 53: | Riga 51: | ||
Shell "gcc -o /tmp/libadhoc.so /tmp/libadhoc.c -shared -fPIC" Wait | Shell "gcc -o /tmp/libadhoc.so /tmp/libadhoc.c -shared -fPIC" Wait | ||
− | + | End | |
− | |||
===Secondo esempio=== | ===Secondo esempio=== | ||
− | + | Quest'altro esempio è molto simile al precedente, ma attribuiamo l'indirizzo di memoria della funzione di Callback di Gambas ad una variabile di tipo Puntatore. | |
Library "/tmp/libadhoc" | Library "/tmp/libadhoc" | ||
Riga 66: | Riga 63: | ||
− | + | Public Sub Main() | |
+ | |||
+ | Dim p As Pointer | ||
CreaSo() | CreaSo() | ||
− | <FONT Color= | + | <FONT Color=green><B>p</b></font> = <FONT Color=#B22222>riceve</font> |
− | + | <FONT Color=blue>Funzione_di_Callback</font>(10, <FONT Color=green><B>p</b></font>) | |
+ | |||
+ | End | ||
− | + | Private Procedure CreaSo() | |
File.Save("/tmp/libadhoc.c", "void <FONT Color=blue>Funzione_di_Callback</font>(int i, <FONT Color=#B22222>void (*Funzione_Callback)(int)</font>) {" & | File.Save("/tmp/libadhoc.c", "void <FONT Color=blue>Funzione_di_Callback</font>(int i, <FONT Color=#B22222>void (*Funzione_Callback)(int)</font>) {" & | ||
Riga 89: | Riga 90: | ||
Shell "gcc -o /tmp/libadhoc.so /tmp/libadhoc.c -shared -fPIC" Wait | Shell "gcc -o /tmp/libadhoc.so /tmp/libadhoc.c -shared -fPIC" Wait | ||
− | + | End | |
− | + | Private Function <FONT Color=#B22222>riceve(rit As Integer)</font> <FONT Color=gray>' ''Funzione Callback''</font> | |
Print "Ricevuto: "; rit | Print "Ricevuto: "; rit | ||
− | + | End | |
− | |||
===Terzo esempio=== | ===Terzo esempio=== | ||
In quest'altro esempio la ''Funzione di Callback'', presente nella libreria esterna ''ad hoc'', non ritornerà alcun dato alla ''funzione callback'' presente in Gambas. | In quest'altro esempio la ''Funzione di Callback'', presente nella libreria esterna ''ad hoc'', non ritornerà alcun dato alla ''funzione callback'' presente in Gambas. | ||
− | |||
Library "/tmp/libadhoc" | Library "/tmp/libadhoc" | ||
Riga 110: | Riga 109: | ||
− | + | Public'Sub Main() | |
<FONT Color=gray>' ''Crea la libreria esterna contenente la "funzione di callback":''</font> | <FONT Color=gray>' ''Crea la libreria esterna contenente la "funzione di callback":''</font> | ||
CreaSo() | CreaSo() | ||
− | <FONT Color=gray>' ''Invoca la "funzione di callback", contenuta nella libreria esterna da noi generata, | + | <FONT Color=gray>' ''Invoca la "funzione di callback", contenuta nella libreria esterna da noi generata, e le passa la "funzione callback" presente di seguito in questo progetto Gambas:''</font> |
− | |||
<FONT Color=blue>Funzione_di_Callback</font>(<FONT Color=#B22222>riceve</font>) | <FONT Color=blue>Funzione_di_Callback</font>(<FONT Color=#B22222>riceve</font>) | ||
− | + | End | |
− | + | Private Procedure CreaSo() | |
File.Save("/tmp/libadhoc.c", "void <FONT Color=blue>Funzione_di_Callback</font>(<FONT Color=#B22222>void *Funzione_Callback(void)</font>) {" & | File.Save("/tmp/libadhoc.c", "void <FONT Color=blue>Funzione_di_Callback</font>(<FONT Color=#B22222>void *Funzione_Callback(void)</font>) {" & | ||
Riga 130: | Riga 128: | ||
Shell "gcc -o /tmp/libadhoc.so /tmp/libadhoc.c -shared" Wait | Shell "gcc -o /tmp/libadhoc.so /tmp/libadhoc.c -shared" Wait | ||
− | + | End | |
− | + | Private Function <FONT Color=#B22222>riceve()</font> <FONT Color=gray>' ''Funzione Callback''</font> | |
Print "Ricevuto !" | Print "Ricevuto !" | ||
− | + | End |
Versione attuale delle 18:21, 12 giu 2024
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.
Facciamo qualche esempio.
Primo esempio
In questo esempio, la libreria esterna, da noi scritta in linguaggio C e che chiameremo libadhoc.c sarà inserita, per maggiore praticità, nel programma principale di Gambas.
Library "/tmp/libadhoc" ' void invia(void (*fp)) Private Extern invia(ricP As Pointer) Public Sub Main() ' Va a creare la nostra libreria condivisa esterna: Creaso() ' Invoca la "Funzione di Callback" della libreria esterna, passandole l'indirizzo della "Funzione Callback" di Gambas: invia(riceve) End Private Function riceve(i As Integer) ' Funzione Callback Print "Ricevuto: "; i End Private Procedure Creaso() File.Save("/tmp/libadhoc.c", "#include <unistd.h>" & "\n\n" & "int (*po)(int); // Dichiarazione del 'Puntatore a Funzione'" & "\n\n" & "void invia(void (*fp)) { // Funzione di Callback" & "\n\n" & " int i = 0;" & "\n\n" & " po = fp; // Inizializzazione del 'Puntatore a Funzione'" & "\n\n" & " while (i < 100) {\n" & "/* Invoca la 'funzione callback' di Gambas mediante il 'Puntatore a Funzione' e le passa il valore della variabile intera 'i': */\n" & " if ((i % 10) == 0) (*po)(i);\n" & " usleep(50000);\n" & " i++;\n}\n\n}") Shell "gcc -o /tmp/libadhoc.so /tmp/libadhoc.c -shared -fPIC" Wait End
Secondo esempio
Quest'altro esempio è molto simile al precedente, ma attribuiamo l'indirizzo di memoria della funzione di Callback di Gambas ad una variabile di tipo Puntatore.
Library "/tmp/libadhoc" ' void Funzione_di_Callback(int i, void (*Funzione_Callback)(int)) ' Funzione di callback. Private Extern Funzione_di_Callback(i As Integer, Funzione_Callback As Pointer) In "/tmp/libadhoc" Public Sub Main() Dim p As Pointer CreaSo() p = riceve Funzione_di_Callback(10, p) End Private Procedure CreaSo() File.Save("/tmp/libadhoc.c", "void Funzione_di_Callback(int i, void (*Funzione_Callback)(int)) {" & "\n\n" & " int n = 100;\n" & " int a;\n" & "\n\n" & " for (i = 0; i < n ; i++) {\n" & " a = i * n;\n" & " Funzione_Callback(a);\n" & " }\n\n}") Shell "gcc -o /tmp/libadhoc.so /tmp/libadhoc.c -shared -fPIC" Wait End Private Function riceve(rit As Integer) ' Funzione Callback Print "Ricevuto: "; rit End
Terzo esempio
In quest'altro esempio la Funzione di Callback, presente nella libreria esterna ad hoc, non ritornerà alcun dato alla funzione callback presente in Gambas.
Library "/tmp/libadhoc" ' void Funzione_di_Callback(void *Funzione_Callback(void)) ' Funzione di callback. Private Extern Funzione_di_Callback(Funzione_Callback As Pointer) Public'Sub Main() ' Crea la libreria esterna contenente la "funzione di callback": CreaSo() ' Invoca la "funzione di callback", contenuta nella libreria esterna da noi generata, e le passa la "funzione callback" presente di seguito in questo progetto Gambas: Funzione_di_Callback(riceve) End Private Procedure CreaSo() File.Save("/tmp/libadhoc.c", "void Funzione_di_Callback(void *Funzione_Callback(void)) {" & "\n\n" & " Funzione_Callback();\n\n}") Shell "gcc -o /tmp/libadhoc.so /tmp/libadhoc.c -shared" Wait End Private Function riceve() ' Funzione Callback Print "Ricevuto !" End