Lettura dati da un Processo e scrittura dati in un Processo mediante Process
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