Lettura dati da un Processo e scrittura dati in un Processo mediante Process

Da Gambas-it.org - Wikipedia.

Aperto un programma come Processo, è possibile leggervi e scrivervi dati mediante le risorse della Classe Process con modalità analoghe a quelle per leggere e per scrivere in un File: [nota 1]

variabile_Processo = Shell "nome_programma" For [Read] [Input] [Write]

oppure

variabile_Processo = Exec ["nome_programma"] For [Read] [Input] [Write]

Le istruzioni "Shell" e "Exec" ritornano una variabile di tipo "Process", ossia un handle, con il quale è possibile gestire il Processo aperto.

Inoltre è possibile assegnare tale Processo ad un Gruppo degli Eventi mediante la parola-chiave "As":

...... For [Read] [Input] [Write] As "nome_gruppo_eventi"

Scrittura di dati in un Processo

Con riferimento alla scrittura di dati nel flusso di un Processo va sottolineato che:

  • per aprire in "Scrittura" un Processo, si devono usare soltanto le parole: For Write;
  • per scrivere i dati nel Processo, si potranno utilizzare le funzioni Write e Print.

Di seguito un breve codice esemplificativo, con il quale lanciamo un programma e lo gestiamo con Process:

Private pr As Process


Public Sub Form_Open()

' Apre il Processo in "Scrittura":
 pr = Shell "nome_del_programma" For Write As "Processo"
' oppure:
 pr = Exec ["nome_del_programma"] For Write As "Processo"

End


Public Sub Button1_Click()

' Scrive nel Processo ad esempio una stringa di testo:
 Write #pr, "testo_qualsiasi"

End


Public Sub Button2_Click()

' Termina il Processo:
 pr.Kill

End


Public Sub Processo_Kill()   ' Quando viene chiuso il programma lanciato...

 Me.Close   ' ...allora viene chiuso anche l'applicativo Gambas

End

Lettura dati da un Processo

Analogamente si procederà quando si devono leggere dati dal flusso di un Processo. Si potrà gestire il processo in lettura sia dichiarandolo con "For Read " che con "For Input "; ed utilizzare, per la effettiva lettura, i seguenti comandi:

  • Read;
  • Input;
  • Line Input;
  • variabile_processo.ReadLine(); per leggere una stringa.

Nel caso che segue, si porrà in osservazione il flusso del Processo: non appena ci sarà qualche dato disponibile da leggere nel Processo, verrà sollevato un apposito evento Processo_Read() :

Private pr As Process


Public Sub Form_Open()

' Apre il Processo in "Lettura":
 pr = Shell "nome_del_programma" For Read As "Processo"  ' oppure: For Input
' oppure:
 pr = Exec ["nome_del_programma"] For Read As "Processo"  ' oppure: For Input

End


Public Sub Button1_Click()

' Termina il Processo:
 pr.Kill
 
End


Public Sub Processo_Read()

 Dim s As String

' Legge dal Processo ad esempio una stringa di testo:
 Line Input #vPr, s
 
 Print s

End

 
Public Sub Processo_Kill()   ' Quando viene chiuso il programma lanciato...

 Me.Close   ' ...allora viene chiuso anche l'applicativo Gambas

End

Nel caso in cui si debbano intercettare i dati provenienti in tempi diversi da un programma esterno è sempre opportuno aprire il "processo" con l'istruzione

... For Input As "..."

e leggere con "Input" o "Line Input".
Mostriamo un esempio, nel quale creiamo un programma in linguaggio C che con un attesa di 500000 microsecondi scrive ciclicamente nello "standard output" dei valori sino a quando non arriverà al valore 10. Il codice Gambas intercetterà quei dati scritti in console e li restituirà nella medesima console come stringa con l'aggiunta di altri caratteri.

Private pr As Process


Public Sub Main()

 ProgrammaC()
 
' Lancia il programma scritto in C e ne gestisce il processo:
 pr = Shell "/tmp/prova" For Input As "Processo"
  
End


Public Sub Processo_Read()

 Dim s As String
 
 Line Input #Last, s
 
 Print "---> "; s
 
End


Private Procedure ProgrammaC()  ' Crea il programma scritto in C

 File.Save("/tmp/prova.c", "#include <stdio.h>\n#include <unistd.h>\n\n" &
                           "int i;\n\n" &
                           "int main() {\n\n" &
                           "   do {\n" &
                           "     printf(\"%d\\n\", i);\n" &
                           "     usleep(500000);\n" &
                           "     ++i;\n" &
                           "   } while (i < 10);\n" &
                           "  return 0;\n}")
 
 Shell "gcc -o /tmp/prova /tmp/prova.c" Wait
 
End


Note

[1] Vedere anche la seguente pagina: Apertura e chiusura di un processo mediante Process