Usare due programmi Gambas contemporaneamente mediante Process, lo standard Output e lo standard Input

Da Gambas-it.org - Wikipedia.

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 ed 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ò invierà il dato come modificato al programma principale mediante lo standard Output, il quale lo intercetterà mediante l'evento _Read() di 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 by As Byte

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

' Qui mostriamo in console il dato intercettato:
   TextLabel1.Text = "Dato intercettato modificato = " & CStr(by)
 
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:
  a = b + 1

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

' ...e vi scrive il valore della variabile "a":
  Write #out, a 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 dei numeri, in particolare: 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.