Differenze tra le versioni di "Intercettare dati inviati al programma dal sistema o da altri programmi utilizzati"

Da Gambas-it.org - Wikipedia.
 
(Una versione intermedia di uno stesso utente non è mostrata)
Riga 1: Riga 1:
Nei casi in cui l'applicativo Gambas riceve dati nella propria console da programmi che nel suo codice sono stati lanciati con ''Exec'' o ''Shell''. Tali dati potranno essere intercettati anche se l'applicativo Gambas è avviato a livello di IDE come semplice progetto.
+
#REDIRECT [[Intercettare_i_dati_inviati_allo_standard_output_da_un_programma_C]]
 
 
Da sottolineare che in questo caso il processo deve essere lanciato in lettura usando, però, le parole ''For Input'' (e NON ''For Read'' !).
 
 
 
 
 
Nell'esempio che segue, i dati intercettati nella console, proveniente da un programma esterno lanciato con ''Exec'' e di cui viene gestito il processo mediante una variabile di tipo ''Process'', vengono poi trasferiti ''direttamente'' in una ''TextArea'' posta sul ''Form'' dell'applicativo Gambas:
 
'''Private''' pr As Process
 
 
 
'''Public''' Sub Form_Open()
 
 
  pr = Exec ["''/percorso/del/programma/di/cui/si/riceveranno/i/dati/in/console''"] <FONT color=#B22222>For Input</font> As "prova"  <FONT color=gray>' ''Può essere usato anche il comando "Shell"''</font>
 
 
'''End'''
 
 
 
'''Public''' Sub prova_Read()
 
 
  TextArea1.Text &= pr.ReadLine() & "\n"
 
 
'''End'''
 
 
 
===Esempi pratici===
 
Un esempio pratico del precedente codice può essere il seguente.
 
<BR>Creiamo un semplicissimo applicativo in linguaggio C che scriva ogni secondo nello standard output un valore decimale intero crescente:
 
#include <stdio.h>
 
 
 
int a;
 
 
void main() {
 
 
  while (1) {
 
 
      printf("%d\n", a);
 
      sleep(1);
 
      a++;
 
 
  };
 
 
}
 
Creiamo, poi, un applicativo Gambas che provvede a lanciare dall'IDE quel codice C gestendone contemporaneamente il processo mediante una variabile di tipo ''Process''.
 
<BR>Ebbene, vedremo che nella console dell'IDE di Gambas verranno scritti i valori sempre crescenti, scritti dall'applicativo in C nello standard output. L'intento, però, è quello di intercettare ''in tempo reale'' tali dati e trasferirli, mostrandoli, in una ''TextArea'' posta sul ''Form'' del progetto Gambas:
 
'''Private''' pr As Process
 
 
 
'''Public''' Sub Form_Open()
 
 
  pr = Shell "''/percorso/dell'applicativo/in/C''" <FONT color=#B22222>For Input</font> As "prova"
 
 
'''End'''
 
 
 
'''Public''' Sub prova_Read()
 
 
 
  TextArea1.Text = pr.ReadLine()
 
 
 
'''End'''
 
 
 
 
 
 
 
In quest'altro esempio sarà lanciato un programma in C, al quale si passerà un valore di tipo ''Stringa''. Il programma, quindi, convertirà in un numerico ''Intero'' questo valore ricevuto e, dopo averlo sommato al valore 100, lo scriverà nello ''stdout''. Il programma Gambas intercetterà il dato dallo ''stdout'' e lo mostrerà, come nel caso precedente, in una ''TextArea''.
 
 
 
Il codice del programma in C sarà il seguente:
 
#include <stdio.h>
 
#include <stdlib.h>
 
 
 
void main(int argc, char *argv[]) {
 
 
 
  int a, b;
 
 
<FONT color=blue>// Converte la Stringa in un numero "Intero":</font>
 
  a = atoi(argv[ 1 ]);
 
 
  b = a + 100;
 
 
  printf("%d", b);
 
 
}
 
 
 
 
 
Il programma Gambas sarà, invece, il seguente:
 
'''Private''' pr As Process
 
'''Private''' i As Integer
 
 
 
'''Public''' Sub Button1_Click()
 
 
  Dim s As String
 
 
  s = CStr(i)
 
 
  pr = Shell "''/percorso/del/programma/in/C'' " & s For Input As "prova"
 
 
  Inc i
 
 
'''End'''
 
 
 
'''Public''' Sub prova_Read()
 
 
 
  TextArea1.Text = pr.ReadLine()
 
 
  pr.Close
 
 
 
'''End'''
 
o più semplicemente:
 
'''Private''' i As Integer
 
 
 
'''Public''' Sub Button1_Click()
 
 
  Dim s As String
 
 
  Shell "''/percorso/del/programma/in/C'' " & CStr(i) To s
 
 
  TextArea1.Text = s
 
 
  Inc i
 
 
'''End'''
 
Ogni qual volta si clicca sul tasto, si vedrà nella ''TextArea'' il valore numerico incrementato di un'unità.
 

Versione attuale delle 15:49, 23 mar 2021