Differenze tra le versioni di "Lettura dati da un Processo e scrittura dati in un Processo mediante Process"
(Creata pagina con "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 scrive...") |
|||
Riga 1: | Riga 1: | ||
− | 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: | + | Aperto un programma come Processo, è possibile leggervi e scrivervi dati mediante le risorse della Classe ''[https://gambaswiki.org/wiki/comp/gb/process?l=it Process]'' con modalità analoghe a quelle per leggere e per scrivere in un File: <SUP>[[[#Note|nota 1]]]</sup> |
variabile_Processo = Shell "nome_programma" For ''[Read] [Input] [Write]'' | variabile_Processo = Shell "nome_programma" For ''[Read] [Input] [Write]'' | ||
oppure | oppure | ||
Riga 12: | Riga 12: | ||
* per aprire in "Scrittura" un Processo, si devono usare <SPAN style="text-decoration:underline">soltanto</span> le parole: ''For Write''; | * per aprire in "Scrittura" un Processo, si devono usare <SPAN style="text-decoration:underline">soltanto</span> le parole: ''For Write''; | ||
* per scrivere i dati <SPAN style="text-decoration:underline">nel</span> Processo, si potranno utilizzare le funzioni ''Write'' e ''Print''. | * per scrivere i dati <SPAN style="text-decoration:underline">nel</span> 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'': | Di seguito un breve codice esemplificativo, con il quale lanciamo un programma e lo gestiamo con ''Process'': | ||
Riga 18: | Riga 17: | ||
− | + | Public Sub Form_Open() | |
<FONT color=gray>' ''Apre il Processo in "Scrittura":''</font> | <FONT color=gray>' ''Apre il Processo in "Scrittura":''</font> | ||
Riga 25: | Riga 24: | ||
'''pr = Exec ["''nome_del_programma''"] For Write As "Processo"'''</font> | '''pr = Exec ["''nome_del_programma''"] For Write As "Processo"'''</font> | ||
− | + | End | |
− | + | ||
+ | Public Sub Button1_Click() | ||
<FONT color=gray>' ''Scrive nel Processo ad esempio una stringa di testo:''</font> | <FONT color=gray>' ''Scrive nel Processo ad esempio una stringa di testo:''</font> | ||
Write #pr, "testo_qualsiasi" | Write #pr, "testo_qualsiasi" | ||
− | + | End | |
− | + | ||
+ | Public Sub Button2_Click() | ||
<FONT color=gray>' ''Termina il Processo:''</font> | <FONT color=gray>' ''Termina il Processo:''</font> | ||
pr.Kill | pr.Kill | ||
− | + | End | |
− | + | ||
+ | Public Sub <FONT color=#006400>Processo</font>_Kill() <FONT color=gray>' ''Quando viene chiuso il programma lanciato...''</font> | ||
Me.Close <FONT color=gray>' ''...allora viene chiuso anche l'applicativo Gambas''</font> | Me.Close <FONT color=gray>' ''...allora viene chiuso anche l'applicativo Gambas''</font> | ||
− | + | End | |
=Lettura dati da un Processo= | =Lettura dati da un Processo= | ||
Riga 58: | Riga 60: | ||
− | + | Public Sub Form_Open() | |
<FONT color=gray>' ''Apre il Processo in "Lettura":''</font> | <FONT color=gray>' ''Apre il Processo in "Lettura":''</font> | ||
Riga 65: | Riga 67: | ||
'''pr = Exec ["''nome_del_programma''"] For Read As "Processo" ' '''oppure: '''For Input'''''</font> | '''pr = Exec ["''nome_del_programma''"] For Read As "Processo" ' '''oppure: '''For Input'''''</font> | ||
− | + | End | |
+ | |||
+ | |||
+ | Public Sub Button1_Click() | ||
− | |||
− | |||
<FONT color=gray>' ''Termina il Processo:''</font> | <FONT color=gray>' ''Termina il Processo:''</font> | ||
pr.Kill | pr.Kill | ||
− | + | End | |
− | + | ||
+ | Public Sub <FONT color=#006400>Processo</font>_Read() | ||
Dim s As String | Dim s As String | ||
Riga 83: | Riga 87: | ||
Print s | Print s | ||
− | + | End | |
+ | |||
− | + | Public Sub <FONT color=#006400>Processo</font>_Kill() <FONT color=gray>' ''Quando viene chiuso il programma lanciato...''</font> | |
Me.Close <FONT color=gray>' ''...allora viene chiuso anche l'applicativo Gambas''</font> | Me.Close <FONT color=gray>' ''...allora viene chiuso anche l'applicativo Gambas''</font> | ||
− | + | 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 | 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 "..." | ... For '''Input''' As "..." | ||
Riga 97: | Riga 102: | ||
− | + | Public Sub Main() | |
− | + | ||
ProgrammaC() | ProgrammaC() | ||
Riga 104: | Riga 109: | ||
pr = Shell "/tmp/prova" For <FONT Color=#B22222><B>Input</b></font> As "<FONT color=#006400>Processo</font>" | pr = Shell "/tmp/prova" For <FONT Color=#B22222><B>Input</b></font> As "<FONT color=#006400>Processo</font>" | ||
− | + | End | |
+ | |||
+ | |||
+ | Public Sub <FONT color=#006400>Processo</font>_Read() | ||
− | |||
− | |||
Dim s As String | Dim s As String | ||
Riga 114: | Riga 120: | ||
Print "---> "; s | Print "---> "; s | ||
− | ''' | + | End |
+ | |||
+ | |||
+ | Private Procedure ProgrammaC() <FONT color=gray>' ''Crea il programma scritto in C''</font> | ||
− | |||
− | |||
File.Save("/tmp/prova.c", "#include <stdio.h>\n#include <unistd.h>\n\n" & | File.Save("/tmp/prova.c", "#include <stdio.h>\n#include <unistd.h>\n\n" & | ||
"int i;\n\n" & | "int i;\n\n" & | ||
Riga 130: | Riga 137: | ||
Shell "gcc -o /tmp/prova /tmp/prova.c" Wait | 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]] |
Versione attuale delle 15:05, 28 ott 2023
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