Differenze tra le versioni di "Usare due programmi Gambas contemporaneamente mediante Process, lo standard Output e lo standard Input"
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>[[[#Note|Nota 1]]]</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>[[[#Note|Nota 1]]]</sup>, mediante "''Process''". | ||
− | Facciamo un esempio in cui abbiamo un programma principale | + | 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''. | ||
+ | <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". | ||
+ | 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 | ||
Riga 11: | Riga 13: | ||
<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 = Exec ["<FONT Color=gray>''/percorso/del/programma/secondo.gambas''</font>"] For Read Write As "secondo" | |
'''End''' | '''End''' | ||
Riga 19: | Riga 21: | ||
<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 | |
'''End''' | '''End''' | ||
Riga 27: | Riga 29: | ||
'''Public''' Sub secondo_Read() | '''Public''' Sub secondo_Read() | ||
− | Dim | + | Dim b As Byte |
<FONT Color=gray>' ''Legge i dati scritti dal programma secondo:''</font> | <FONT Color=gray>' ''Legge i dati scritti dal programma secondo:''</font> | ||
− | + | Read #scnd, b | |
<FONT Color=gray>' ''Qui mostriamo in console il dato intercettato:''</font> | <FONT Color=gray>' ''Qui mostriamo in console il dato intercettato:''</font> | ||
− | + | TextLabel1.Text = "Dato intercettato modificato = " & CStr(b) | |
'''End''' | '''End''' | ||
Riga 40: | Riga 42: | ||
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: | 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 | Private flIn As File | ||
Riga 47: | Riga 48: | ||
<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 | |
'''End''' | '''End''' | ||
Riga 58: | Riga 59: | ||
<FONT Color=gray>' ''Legge il dato passato dallo standard Input:''</font> | <FONT Color=gray>' ''Legge il dato passato dallo standard Input:''</font> | ||
− | + | Read #flIn, b | |
− | + | flIn.Close | |
<FONT Color=gray>' ''Mostra nella propria TextLabel il dato intercettato:''</font> | <FONT Color=gray>' ''Mostra nella propria TextLabel il dato intercettato:''</font> | ||
− | + | TextLabel1.Text = CStr(b) | |
<FONT Color=gray>' ''Effettua la modifica del dato intercettato:''</font> | <FONT Color=gray>' ''Effettua la modifica del dato intercettato:''</font> | ||
− | + | Inc b | |
<FONT Color=gray>' ''Apre lo standard Output per la Scrittura...''</font> | <FONT Color=gray>' ''Apre lo standard Output per la Scrittura...''</font> | ||
− | + | out = Open "/dev/stdout" For Write | |
<FONT Color=gray>' ''...e vi scrive il valore della variabile "a":''</font> | <FONT Color=gray>' ''...e vi scrive il valore della variabile "a":''</font> | ||
− | + | Write #out, b As Byte | |
− | + | out.Close | |
'''End''' | '''End''' |
Versione delle 17:51, 24 apr 2021
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 = 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 a, 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 valore della variabile "a": 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.