Differenze tra le versioni di "Lettura dati da un Processo e scrittura dati in un Processo mediante Process"

Da Gambas-it.org - Wikipedia.
(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>&#091;[[#Note|nota 1]]&#093;</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()
+
  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'''
+
  End
 
   
 
   
  '''Public''' Sub Button1_Click()
+
   
 +
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'''
+
  End
 
   
 
   
  '''Public''' Sub Button2_Click()
+
   
 +
Public Sub Button2_Click()
 
   
 
   
 
  <FONT color=gray>' ''Termina il Processo:''</font>
 
  <FONT color=gray>' ''Termina il Processo:''</font>
 
   pr.Kill
 
   pr.Kill
 
   
 
   
  '''End'''
+
  End
 
   
 
   
  '''Public''' Sub <FONT color=#006400>Processo</font>_Kill()  <FONT color=gray>' ''Quando viene chiuso il programma lanciato...''</font>
+
   
 +
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'''
+
  End
  
 
=Lettura dati da un Processo=
 
=Lettura dati da un Processo=
Riga 58: Riga 60:
 
   
 
   
 
   
 
   
  '''Public''' Sub Form_Open()
+
  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'''
+
  End
 +
 +
 +
Public Sub Button1_Click()
 
   
 
   
'''Public''' Sub Button1_Click()
 
 
 
 
  <FONT color=gray>' ''Termina il Processo:''</font>
 
  <FONT color=gray>' ''Termina il Processo:''</font>
 
   pr.Kill
 
   pr.Kill
 
    
 
    
  '''End'''
+
  End
 
   
 
   
  '''Public''' Sub <FONT color=#006400>Processo</font>_Read()
+
   
 +
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'''
+
  End
 +
 
    
 
    
  '''Public''' Sub <FONT color=#006400>Processo</font>_Kill()  <FONT color=gray>' ''Quando viene chiuso il programma lanciato...''</font>
+
  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'''
+
  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()
+
  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'''
+
  End
 +
 +
 +
Public Sub <FONT color=#006400>Processo</font>_Read()
 
   
 
   
'''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'''
+
  End
 +
 +
 +
Private Procedure ProgrammaC()  <FONT color=gray>' ''Crea il programma scritto in C''</font>
 
   
 
   
'''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'''
+
  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