Autore Topic: Interagire con il terminale linux  (Letto 8717 volte)

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.724
  • Ne mors quidem nos iunget
    • Mostra profilo
Re: Interagire con il terminale linux
« Risposta #15 il: 23 Dicembre 2013, 13:25:26 »
Citazione
Non fa aprire alcun Terminale.
... aprire un terminale esterno a quello di gambas per poter gestire dall'esterno i dati di risultato e poi riportarli dentro in gambas...

Questa modalità probabilmente sarebbe più agevole, se usi l'applicativo Gambas come progetto e non come eseguibile mioapplicativo.gambas.

Inoltre, per aprire un classico Terminale esterno con le sole funzioni di Gambas, si può utilizzare la funzione:
Codice: gambas [Seleziona]

   Desktop.OpenTerminal

avendo cura, però, di attivare il componente gb.desktop
« Chiunque, non ricorrendo lo stato di necessità, nel proprio progetto Gambas fa uso delle istruzioni Shell o Exec, è punito con la sanzione pecuniaria da euro 20,00 a euro 60,00. »

Offline aleandro

  • Gambero
  • **
  • Post: 72
    • Mostra profilo
Re: Interagire con il terminale linux
« Risposta #16 il: 23 Dicembre 2013, 13:27:48 »
Grazie per le dritte. Ci sto prendendo gusto. Ora faccio altre prove.

Codice: [Seleziona]
Desktop.OpenTerminal
  Visto. Mi viene il dubbio che sia praticabile quello che ho detto ovvero di dirigere all'esterno gli output.
« Ultima modifica: 23 Dicembre 2013, 13:31:14 da aleandro »

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.724
  • Ne mors quidem nos iunget
    • Mostra profilo
Re: Interagire con il terminale linux
« Risposta #17 il: 23 Dicembre 2013, 13:37:38 »
Ci sto prendendo gusto. Ora faccio altre prove.

Questo argomento da te sollevato è una bestia nera !  :-X
I miei esperimenti e studi al riguardo sono esposti nelle pagine che ti ho segnalato innanzi, ed in particolare in questo capitolo della nostra WIKI:
http://www.gambas-it.org/wiki/index.php?title=Guide_della_comunit%C3%A0#Terminale_-_Console_IDE_Gambas


... dirigere all'esterno gli output.

Potresti anche dirigere su un file qualsiasi, o addirittura su un programma Gambas secondario d'appoggio.  :-\
« Chiunque, non ricorrendo lo stato di necessità, nel proprio progetto Gambas fa uso delle istruzioni Shell o Exec, è punito con la sanzione pecuniaria da euro 20,00 a euro 60,00. »

Offline aleandro

  • Gambero
  • **
  • Post: 72
    • Mostra profilo
Re: Interagire con il terminale linux
« Risposta #18 il: 23 Dicembre 2013, 13:46:21 »
Citazione
Potresti anche dirigere su un file qualsiasi

Non per come funziona units. Bisognerebbe modificare units in modo da avere un output su file. Allora sarebbe tutto più semplice.

Forse per questo motivo nessuno ha mai fatto una gui per units.

« Ultima modifica: 23 Dicembre 2013, 13:59:40 da aleandro »

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.724
  • Ne mors quidem nos iunget
    • Mostra profilo
Re: Interagire con il terminale linux
« Risposta #19 il: 24 Dicembre 2013, 01:35:07 »
Ho fatto altre prove, creando un apposito piccolo e semplicissimo programma, che ho scritto in C:
Codice: c [Seleziona]
#include <stdio.h>

int a;

void main() {

   while (1) {

      printf("-> %d\n", a);
      sleep (1);
      a++;

   };

}

il quale ogni secondo scrive nello standard output un valore numerico crescente.

Ho, poi, realizzato un piccolo applicativo in Gambas che lancia e gestisce il processo di quel programmino C con Exec [].

Se pongo la riga del comando Exec [] in modo essenziale:
Codice: gambas [Seleziona]
pr = Exec ["/percorso/del/programmino/C"]

vedo scrivere nella console dell'IDE di Gambas ogni secondo i numeri crescenti.

Invece, per intercettare questi dati dalla console ad una TextArea, posta sul Form, ho dovuto ovviamente porre in osservazione il processo.
La differenza rispetto ai precedenti tentativi, anche in questa discussione esposti negli ultimi inteventi e nella WIKI, è che il processo va dichiarato eseguito in lettura con la parola For Input, e non For Read:
Codice: gambas [Seleziona]

   pr = Exec ["/percorso/del/programmino/C"] For INPUT As "prova"


Mi pare che tu, però, abbia bisogno di una dichiarazione doppia, in lettura ed in scrittura, del processo. In tal caso, Gambas non accetta la compresenza della parola Input e della parola Write. Pertanto, devi provare l'efficienza del tuo codice utilizzando congiuntamente le parole Input ed Output.
« Chiunque, non ricorrendo lo stato di necessità, nel proprio progetto Gambas fa uso delle istruzioni Shell o Exec, è punito con la sanzione pecuniaria da euro 20,00 a euro 60,00. »

Offline aleandro

  • Gambero
  • **
  • Post: 72
    • Mostra profilo
Re: Interagire con il terminale linux
« Risposta #20 il: 24 Dicembre 2013, 02:22:01 »
Codice: [Seleziona]
 pr As Process  
 
     
  Public Sub Form_Open() 
     
    pr = Shell "units" For Input Output As "pr"
     
  End 
 
  Public Sub Button1_Click() 
   
     Print #pr, TextArea1.Text 
     Print #pr, TextArea2.Text
     
  End

Mi sembrava ragionevole che fosse così. Purtroppo non va. Era un esperimento che avevo già fatto ieri. Non funziona neppure con Read Write- Nel tuo caso di programma in C l'interazione è di sola lettura. Invece units ha due fasi di scrittura ed una di lettura.....

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.724
  • Ne mors quidem nos iunget
    • Mostra profilo
Re: Interagire con il terminale linux
« Risposta #21 il: 24 Dicembre 2013, 02:31:17 »
Non funziona neppure con Read Write- ... units ha due fasi di scrittura ed una di lettura.....

Ma con il solo Write
   http://www.gambas-it.org/smf/index.php?topic=3165.msg31618#msg31618
mi sembra che tu abbia detto che funziona. Giusto ?
« Chiunque, non ricorrendo lo stato di necessità, nel proprio progetto Gambas fa uso delle istruzioni Shell o Exec, è punito con la sanzione pecuniaria da euro 20,00 a euro 60,00. »

Offline aleandro

  • Gambero
  • **
  • Post: 72
    • Mostra profilo
Re: Interagire con il terminale linux
« Risposta #22 il: 24 Dicembre 2013, 02:50:06 »
Con il solo Write funzionano le prime due fasi del programma ovvero quelle in scrittura sulla console di gambas. La terza fase è quella di lettura del risultato. Questa è un mistero.

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.724
  • Ne mors quidem nos iunget
    • Mostra profilo
Re: Interagire con il terminale linux
« Risposta #23 il: 24 Dicembre 2013, 03:01:21 »
Con il solo Write funzionano le prime due fasi del programma ovvero quelle in scrittura sulla console di gambas.

Ma il Write non credo sia il comando che ti faccia scrivere sulla console i dati di units.

Dovrebbe bastare per scrivere nella console dell'IDE di Gambas la semplice riga:
Codice: gambas [Seleziona]
Shell "units"


Il comando Write scrive nel flusso del processo.
« Ultima modifica: 24 Dicembre 2013, 09:36:15 da vuott »
« Chiunque, non ricorrendo lo stato di necessità, nel proprio progetto Gambas fa uso delle istruzioni Shell o Exec, è punito con la sanzione pecuniaria da euro 20,00 a euro 60,00. »

Offline aleandro

  • Gambero
  • **
  • Post: 72
    • Mostra profilo
Re: Interagire con il terminale linux
« Risposta #24 il: 24 Dicembre 2013, 18:53:07 »
Codice: [Seleziona]
 pr As Process  
 
     
  Public Sub Form_Open() 
     
    pr = Shell "units" For Write
     
  End 
 
  Public Sub Button1_Click() 
   
     Print #pr, TextArea1.Text 
     Print #pr, TextArea2.Text
     Read #pr, TextArea3.Text
     
  End

Invece proprio quello mi permette di immettere i dati di TextArea1 e TextArea2. Mi spiego ma sarebbe meglio che tu provassi ad installare units.
TextArea1.Text  contiene le unità da convertire
TextArea2.Text contiene le unità che si vogliono ottenere.
TextArea3.Text contiene l'equivalenza tra la prima e la seconda ovvero il risultato finale.

Non riesco a leggere il risultato finale malgrado sia scritto in chiaro nella console di gambas. Questo è il problema.

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.724
  • Ne mors quidem nos iunget
    • Mostra profilo
Re: Interagire con il terminale linux
« Risposta #25 il: 24 Dicembre 2013, 19:19:55 »
Invece proprio quello mi permette di immettere i dati di TextArea1 e TextArea2.

Non riesco a leggere il risultato finale malgrado sia scritto in chiaro nella console di gambas. Questo è il problema.


Io ho sin dall'inizio compreso il problema fondamentale.
Avevo capito male la questione della scrittura. Certo, dunque, con For Write ti consente appunto di scrivere il contenuto delle TextAree nel flusso del processo.

Riguardo all'intercettazione dei dati dalla console dell?IDE di Gambas, c'è il problema di non poter scrivere For Input Write.


... sarebbe meglio che tu provassi ad installare units.


Scusa, ma il nome del programma sarebbe: udunits2 ?
http://www.unidata.ucar.edu/software/udunits/udunits-2/udunits2.html
« Ultima modifica: 24 Dicembre 2013, 19:25:41 da vuott »
« Chiunque, non ricorrendo lo stato di necessità, nel proprio progetto Gambas fa uso delle istruzioni Shell o Exec, è punito con la sanzione pecuniaria da euro 20,00 a euro 60,00. »

Offline aleandro

  • Gambero
  • **
  • Post: 72
    • Mostra profilo
Re: Interagire con il terminale linux
« Risposta #26 il: 24 Dicembre 2013, 20:00:38 »
No il programma si chiama units.

Codice: [Seleziona]
sudo apt-get install units
units

Ti confondi con un pacchetto che fa cose simili.

http://manpages.ubuntu.com/manpages/maverick/man1/units.1.html

Lol ho appena letto che si può usare in modo non interattivo e che riesce a generare degli output...Buona speranza allora.
« Ultima modifica: 24 Dicembre 2013, 20:12:29 da aleandro »

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.724
  • Ne mors quidem nos iunget
    • Mostra profilo
Re: Interagire con il terminale linux
« Risposta #27 il: 25 Dicembre 2013, 00:46:51 »
No il programma si chiama units.

Ah, capisco.


Ad ogni modo, tornerei a valutare la possibilità di intercettare i dati mediante la sola parola For INPUT (anziché For Read). Infatti gli argomenti da passare, potrebbero essere passati preliminarmente all'atto del lancio del programma units. Ciò eviterebbe di prevedere una gestione in scrittura del flusso del processo.  :-\
« Chiunque, non ricorrendo lo stato di necessità, nel proprio progetto Gambas fa uso delle istruzioni Shell o Exec, è punito con la sanzione pecuniaria da euro 20,00 a euro 60,00. »

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.724
  • Ne mors quidem nos iunget
    • Mostra profilo
Re: Interagire con il terminale linux
« Risposta #28 il: 25 Dicembre 2013, 01:51:58 »
...direi di più.
Se il programma units deve essere sempre riavviato per effettuare una conversione richiesta, allora non c'è proprio bisogno di porre in osservazione il flusso del processo.

Si può fare mooolto più semplicemente come nell'esempio che segue con il programma wmctrl:
Codice: gambas [Seleziona]
Public Sub Form_Open()

  Dim s As String

    Shell "wmctrl -l -p" To s

    Print s

End

« Ultima modifica: 25 Dicembre 2013, 01:53:59 da vuott »
« Chiunque, non ricorrendo lo stato di necessità, nel proprio progetto Gambas fa uso delle istruzioni Shell o Exec, è punito con la sanzione pecuniaria da euro 20,00 a euro 60,00. »

Offline aleandro

  • Gambero
  • **
  • Post: 72
    • Mostra profilo
Re: Interagire con il terminale linux
« Risposta #29 il: 25 Dicembre 2013, 14:23:03 »
Codice: [Seleziona]
Public Sub Form_Open()  
  End
    
    
    Public Sub Button1_Click()
    
     Dim a As String
     Dim b As String
     Dim risultato As String  
    
     a = TextArea1.Text
     b = TextArea2.Text
     Shell "units a b" To risultato
    
     TextArea3.Text = risultato
    
    
    End

Ho provato a cambiare approccio. Units viene avviato immettendo come unità di misura da convertire la variabile "a" e quella da ottenere come variabile "b" poi come detto il programma termina e si può ripartire da capo (mentre prima si avviava un processo infinito). Il comando da shell è giusto perchè funziona dalla shell di linux. Tuttavia il risultato non quadra perchè è come se non leggesse la a e la b. Forse sbaglio a mettere questo codice in questo modo. Eppure le due variabili le devo pescare dai due campi TextArea1 e  TextArea2 per poi essere in grado di mettere il risultato in unad terza TextArea3.

Suggerimenti? Penso che siamo vicini alla soluzione. Si tratta di immettere correttamente le due variabili a e b.
« Ultima modifica: 25 Dicembre 2013, 15:01:33 da aleandro »