Non e' la prima volta che affrontiamo l'argomento, ma devo dire che ogni volta la soluzione 'e sempre un escamotage.
Quando lanciate un comando shell, di solito, ottenete lo standard output nella finestra "console" di gambas.
Ora la mia esigenza e' intercettare questo output e agire di conseguenza ....
Nello specifico il comando che lancio e':
Shell "melt -profile dv_pal -timings -consumer decklink:0 terminate_on_pause=1 \x22" & Path & "\x22" For Write As "Osserva"
con:
Public Sub Osserva_Read()
Dim sLine As String
Read #Last, sLine, -256
Debug sLine
End
Public Sub Osserva_Write()
Debug "-osserva-"
End
che non danno segni di vita (il processo lanciato nella shell gira in background ....)
notare che se invece il comando che lancio e':
Shell "melt -profile dv_pal -timings -consumer decklink:0 terminate_on_pause=1 \x22" & Path & "\x22" For Read As "Osserva"
la riproduzione del video (melt e' un player video) non parte proprio ...
PS: la cosa interessante e' che usando il comando:
questo comando guarda a partire dalla coda gli eventi del vostro sistema (quindi magari mettete e smontate chiavette per avere degli eventi ....)
il ritorno c'e l'ho .... e' come se melt uscisse su un'altra console ... e' possibile?
In via generale, quando un programma lanciato con (la maledetta) Shell restituisce un unico flusso di dati, è sufficiente usare la parola-chiave "To" per raccoglierli.
Un semplicissimo esempio è dato dal comando "ls":
Public Sub Main()
Dim s As String
Shell "ls /tmp" To s
Print s
Print Split(s, "\n")[1]
End
Insomma, in questo caso l'invio di dati e la loro intercettazione si esauriscono in un solo momento.
Quando invece il "processo", avviato con Shell, invia nel tempo uno o più dati, questi possono essere intercettati solo ponendo in "osservazione" la viariabile handle del processo aperto:
http://www.gambas-it.org/wiki/index.php?title=Lettura_dati_da_un_Processo_e_scrittura_dati_in_un_Processo
Un paio di esempi possono essere questi:
http://www.gambas-it.org/wiki/index.php?title=Intercettare_i_dati_del_mouse_dal_suo_file-device#Apertura_del_file-device_medinate_la_Classe_Process
http://www.gambas-it.org/wiki/index.php?title=La_gestione_dei_dati_Midi_senza_l%27uso_delle_funzioni_di_Alsa#Ricezione_mediante_Process
Interessante, ma non vorrei mostrare agli utenti la console, ma estrarre i dati dalla stessa per delle elaborazioni in background (sapere lo stato della riproduzione di un file).
A questo punto pensavo di bypassare il problema passando da un oggetto "terzo" ed esterno (con il mio video convertitore batch basato su ffmpeg ho fatto in modo simile.)
ovvero, passare per un file esterno (un log) che scrive il processo lanciato dalla shell e che il programma gambas legge ed interpreta.
Ma mentre ffmpeg ha la possibilita di generare autonomamente un file di statistiche (e' una opzione del programma), in questo caso ho dovuto usare le redirezioni tipiche della bash linux.
in pratica il comando con redirezione e':
If Exist(User.Home & "/mlt_output.log") Then Kill (User.Home & "/mlt_output.log")
melt -profile dv_pal -timings -consumer decklink:0 terminate_on_pause=1 path_del_file_video &> /home/utente/mlt_output.log
ed in un timer leggo il contenuto con un tail o similare:
che (lanciando tutto da shell) mi tira fuori qualcosa del genere (varia man mano che interpreta il file):
| 2018-04-12 12:45:39.739 | consumer_decklink.cpp:803: T(render)=8340 us
ora pero' la cosa e' ancora piu' strana, perche' se le stesse IDENTICHE cose le lancio dal mio programma gambas:
comando = "melt -profile dv_pal -timings -consumer decklink:0 terminate_on_pause=1 " & Path & " &> " & User.Home & "/mlt_output.log"
Shell comando
il timer dove ho messo la lettura del file, mi ritorna il NULLA (giustamente, visto che ho cancellato il file prima di lanciare la NUOVA riproduzione)
allora, per ora l'unica cosa che sono riuscito ad ottenere (e solo con l'uso di "For Output" e' la possibilita' di MANDARE comandi al player/comando_shell.
' Gambas class file
Public comando As String = "melt -profile dv_pal -timings -consumer decklink:0 terminate_on_pause=1 /home/v1p3r/Video/2016-11-27\\ Leathernecks\\ camp/FHD0005.MOV &> /home/v1p3r/test.log"
'Public comando As String = "melt -profile dv_pal -timings -consumer decklink:0 terminate_on_pause=1 /home/v1p3r/Video/2016-11-27\\ Leathernecks\\ camp/FHD0005.MOV"
Public logfile As String
Public processo As Process
Public Sub Button1_Click()
processo = Shell comando For Output
End
Public Sub Button2_Click()
Write #processo, "q"
End
impossibile estrarre dati o avere statistiche ....