Differenze tra le versioni di "Usare due programmi Gambas contemporaneamente mediante Process, lo standard Output e lo standard Input"

Da Gambas-it.org - Wikipedia.
 
(2 versioni intermedie di uno stesso utente non sono mostrate)
Riga 1: Riga 1:
E' possibile utilizzare due o anche più programmi Gambas contemporaneamente, che si passano valori attraverso lo "''standard Output'' " e lo "''standard Input'' " <SUP>&#091;[[#Note|Nota 1]]&#093;</sup>, mediante "''Process''".
+
E' possibile utilizzare due o anche più programmi Gambas contemporaneamente, che si passano valori attraverso lo "''standard Output'' " e lo "''standard Input'' " <SUP>&#091;[[#Note|nota 1]]&#093;</sup>, mediante "''Process''".
  
 
Facciamo un esempio in cui abbiamo un programma principale e uno secondario.
 
Facciamo un esempio in cui abbiamo un programma principale e uno secondario.
Riga 5: Riga 5:
 
Avremo il programma principale che avvia il programma secondario (che chiameremo: ''secondo.gambas'') e lo gestisce con ''Process''.
 
Avremo il programma principale che avvia il programma secondario (che chiameremo: ''secondo.gambas'') e lo gestisce con ''Process''.
 
<BR>Il programma principale invia mediante ''Process'' un dato numerico al programma secondario.
 
<BR>Il programma principale invia mediante ''Process'' un dato numerico al programma secondario.
<BR>Il programma secondario intercetta quindi con l'evento ''_Read()'' il dato passato dallo "Standard Input", lo mostra in una ''TextLabel'' e lo modifica sommandolo ad un altro valore. Dopo ciò esso invierà il dato, come modificato, al programma principale mediante lo "Standard Output".
+
<BR>Il programma secondario intercetta quindi con l'Evento "_Read()" il dato passato dallo "Standard Input", lo mostra in una ''TextLabel'' e lo modifica sommandolo ad un altro valore. Dopo ciò esso invierà il dato, come modificato, al programma principale mediante lo "Standard Output".
<BR>Il programma principale intercetterà il dato, inviatogli dal programma secondario, mediante l'evento "_Read()" della Classe ''Process'' leggendolo dal flusso del processo rappresentato dalla variabile di tipo ''Process''.
+
<BR>Il programma principale intercetterà il dato, inviatogli dal programma secondario, mediante l'Evento "_Read()" della Classe ''Process'' leggendolo dal flusso del processo rappresentato dalla variabile di tipo ''Process''.
 
  Private scnd As Process
 
  Private scnd As Process
 
   
 
   
 
   
 
   
  '''Public''' Sub Button1_Click()
+
  Public Sub Button1_Click()
 
   
 
   
 
  <FONT Color=gray>' ''Avviamo il programma secondario e lo gestiamo con "''Process''":''</font>
 
  <FONT Color=gray>' ''Avviamo il programma secondario e lo gestiamo con "''Process''":''</font>
   scnd = Shell "<FONT Color=gray>''/percorso/del/programma/secondo.gambas''</font>" For Read Write As "secondo"
+
   scnd = Shell "<FONT Color=darkgreen>''/percorso/del/programma/secondo.gambas''</font>" For Read Write As "secondo"
 
    
 
    
 
  <FONT Color=gray>' ''oppure:''
 
  <FONT Color=gray>' ''oppure:''
   '''''scnd = Exec ["<FONT Color=gray>/percorso/del/programma/secondo.gambas</font>"] For Read Write As "secondo"'''''</font>
+
   '''''scnd = Exec ["<FONT Color=darkgreen>/percorso/del/programma/secondo.gambas</font>"] For Read Write As "secondo"'''''</font>
 
   
 
   
  '''End'''
+
  End
 
   
 
   
 
   
 
   
  '''Public''' Sub Button2_Click()
+
  Public Sub Button2_Click()
 
   
 
   
 
  <FONT Color=gray>' ''Inviamo al programma secondario il valore numerico:''</font>
 
  <FONT Color=gray>' ''Inviamo al programma secondario il valore numerico:''</font>
 
   Write #scnd, 99 As Byte
 
   Write #scnd, 99 As Byte
 
   
 
   
  '''End'''
+
  End
 
   
 
   
 
   
 
   
 
  <FONT Color=gray>' ''Se potrà essere letto almeno un byte dal processo "secondo", verrà sollevata questa subroutine:''</font>
 
  <FONT Color=gray>' ''Se potrà essere letto almeno un byte dal processo "secondo", verrà sollevata questa subroutine:''</font>
  '''Public''' Sub secondo_Read()
+
  Public Sub secondo_Read()
 
   
 
   
 
   Dim b As Byte
 
   Dim b As Byte
Riga 40: Riga 40:
 
   TextLabel1.Text = "Dato intercettato modificato = " & CStr(b)
 
   TextLabel1.Text = "Dato intercettato modificato = " & CStr(b)
 
    
 
    
  '''End'''
+
  End
 
 
  
  
Riga 48: Riga 47:
 
   
 
   
 
   
 
   
  '''Public''' Sub Form_Open()
+
  Public Sub Form_Open()
 
   
 
   
 
  <FONT Color=gray>' ''Apre lo standard Input per la lettura...''</font>
 
  <FONT Color=gray>' ''Apre lo standard Input per la lettura...''</font>
 
   flIn = Open "/dev/stdin" For Read Watch
 
   flIn = Open "/dev/stdin" For Read Watch
 
   
 
   
  '''End'''
+
  End
 
   
 
   
 
   
 
   
  '''Public''' Sub File_Read()
+
  Public Sub File_Read()
 
   
 
   
 
   Dim out As File
 
   Dim out As File
Riga 80: Riga 79:
 
   out.Close
 
   out.Close
 
   
 
   
  '''End'''
+
  End
  
  
 
----
 
----
 
Al termine dell'intera procedura avremo nella TextLabel del programma secondario scritto il dato: 99, mentre nella TextLabel del programma principale scritto il dato come modificato: 100.
 
Al termine dell'intera procedura avremo nella TextLabel del programma secondario scritto il dato: 99, mentre nella TextLabel del programma principale scritto il dato come modificato: 100.
 
  
  
  
 
=Note=
 
=Note=
[1] Quando un programma viene eseguito, il sistema operativo genera tre file chiamati rispettivamente: "''standard input''", "''standard output''" e "''standard error''".  
+
[1] Quando un programma viene eseguito, il sistema operativo genera tre file chiamati rispettivamente: "''standard input'' ", "''standard output'' " e "''standard error'' ".  
<BR>Di norma lo "''standard input''" è riferito alla tastiera, mentre lo "''standard output''" e lo "''standard error''" sono riferiti allo schermo. Ogni rapporto e riferimento ai file avviene attraverso un proprio Puntatore al file, chiamato "''descrittore di file''". I ''descrittori'' di questi tre file sono rappresentati con i numeri: 0, 1 e 2.
+
<BR>Di norma lo "''standard input'' " è riferito alla tastiera, mentre lo "''standard output'' " e lo "''standard error'' " sono riferiti allo schermo. <BR>Ogni rapporto e riferimento ai file avviene attraverso un proprio Puntatore al file, chiamato "''descrittore di file'' ". I ''descrittori'' di questi tre file sono rappresentati con i numeri: 0, 1 e 2:
 
<BR>0 = "''standard input'' ": il programma legge i dati scritti/inviati dalla periferica.
 
<BR>0 = "''standard input'' ": il programma legge i dati scritti/inviati dalla periferica.
 
<BR>1 = "''standard output'' ": il programma scrive/invia dati alla periferica, la quale legge i dati inviati dal programma.
 
<BR>1 = "''standard output'' ": il programma scrive/invia dati alla periferica, la quale legge i dati inviati dal programma.
 
<BR>2 = "''standard error'' ": il programma scrive/invia messaggi d'errore al video.
 
<BR>2 = "''standard error'' ": il programma scrive/invia messaggi d'errore al video.
 +
<BR>I dati introdotti in input con la tastiera vengono inseriti all'interno di un canale costituito da una sequenza continua di byte. Allo stesso modo i dati prodotti a video vengono inseriti all'interno di un altro canale. Tali canali vengono definiti ''standard input'' e ''standard output''. Pertanto la tastiera e' il canale ''standard input'' ed il video e' il canale ''standard output''. Qualsiasi comando quindi, accetta in input dei valori che legge dallo ''standard input'' (la tastiera) e produce dei risultati scrivendoli nello ''standard output'' (il video). Ma un comando può produrre anche dei messaggi di errore se per esempio vengono introdotti dei valori in input non validi. I messaggi di errore dei comandi vengono scritti in un terzo canale, lo ''standard error''.
 +
<BR>Come già visto, ogni canale standard e' identificabile da un numero: 0 per il canale ''standard input'', 1 per il canale ''standard output'' e 2 per il canale ''standard error''.

Versione attuale delle 12:07, 22 giu 2024

E' possibile utilizzare due o anche più programmi Gambas contemporaneamente, che si passano valori attraverso lo "standard Output " e lo "standard Input " [nota 1], mediante "Process".

Facciamo un esempio in cui abbiamo un programma principale e uno secondario.

Avremo il programma principale che avvia il programma secondario (che chiameremo: secondo.gambas) e lo gestisce con Process.
Il programma principale invia mediante Process un dato numerico al programma secondario.
Il programma secondario intercetta quindi con l'Evento "_Read()" il dato passato dallo "Standard Input", lo mostra in una TextLabel e lo modifica sommandolo ad un altro valore. Dopo ciò esso invierà il dato, come modificato, al programma principale mediante lo "Standard Output".
Il programma principale intercetterà il dato, inviatogli dal programma secondario, mediante l'Evento "_Read()" della Classe Process leggendolo dal flusso del processo rappresentato dalla variabile di tipo Process.

Private scnd As Process


Public Sub Button1_Click()

' Avviamo il programma secondario e lo gestiamo con "Process":
 scnd = Shell "/percorso/del/programma/secondo.gambas" For Read Write As "secondo"
 
' oppure:
 scnd = Exec ["/percorso/del/programma/secondo.gambas"] For Read Write As "secondo"

End


Public Sub Button2_Click()

' Inviamo al programma secondario il valore numerico:
 Write #scnd, 99 As Byte

End


' Se potrà essere letto almeno un byte dal processo "secondo", verrà sollevata questa subroutine:
Public Sub secondo_Read()

 Dim b As Byte

' Legge i dati scritti dal programma secondo:
 Read #scnd, b

' Qui mostriamo in console il dato intercettato:
 TextLabel1.Text = "Dato intercettato modificato = " & CStr(b)
 
End


Il programma secondario (chiamato: secondo.gambas) che intercetta attraverso lo "Standard Input" il dato inviatogli, e lo re-invia - come modificato - al programma principale attraverso lo "Standard Output", sarà questo:

Private flIn As File


Public Sub Form_Open()

' Apre lo standard Input per la lettura...
 flIn = Open "/dev/stdin" For Read Watch

End


Public Sub File_Read()

 Dim out As File
 Dim b As Byte

' Legge il dato passato dallo standard Input:
 Read #flIn, b

 flIn.Close

' Mostra nella propria TextLabel il dato intercettato:
 TextLabel1.Text = CStr(b)

' Effettua la modifica del dato intercettato:
 Inc b

' Apre lo standard Output per la Scrittura...
 out = Open "/dev/stdout" For Write

' ...e vi scrive il nuovo valore della variabile "b":
 Write #out, b As Byte

 out.Close

End



Al termine dell'intera procedura avremo nella TextLabel del programma secondario scritto il dato: 99, mentre nella TextLabel del programma principale scritto il dato come modificato: 100.


Note

[1] Quando un programma viene eseguito, il sistema operativo genera tre file chiamati rispettivamente: "standard input ", "standard output " e "standard error ".
Di norma lo "standard input " è riferito alla tastiera, mentre lo "standard output " e lo "standard error " sono riferiti allo schermo.
Ogni rapporto e riferimento ai file avviene attraverso un proprio Puntatore al file, chiamato "descrittore di file ". I descrittori di questi tre file sono rappresentati con i numeri: 0, 1 e 2:
0 = "standard input ": il programma legge i dati scritti/inviati dalla periferica.
1 = "standard output ": il programma scrive/invia dati alla periferica, la quale legge i dati inviati dal programma.
2 = "standard error ": il programma scrive/invia messaggi d'errore al video.
I dati introdotti in input con la tastiera vengono inseriti all'interno di un canale costituito da una sequenza continua di byte. Allo stesso modo i dati prodotti a video vengono inseriti all'interno di un altro canale. Tali canali vengono definiti standard input e standard output. Pertanto la tastiera e' il canale standard input ed il video e' il canale standard output. Qualsiasi comando quindi, accetta in input dei valori che legge dallo standard input (la tastiera) e produce dei risultati scrivendoli nello standard output (il video). Ma un comando può produrre anche dei messaggi di errore se per esempio vengono introdotti dei valori in input non validi. I messaggi di errore dei comandi vengono scritti in un terzo canale, lo standard error.
Come già visto, ogni canale standard e' identificabile da un numero: 0 per il canale standard input, 1 per il canale standard output e 2 per il canale standard error.