Capturar Salida Comando "udp-sender" Gambas 3


Objetivo: Capturar Salida Comando "udp-sender" Gambas 3
Hola a todos.

Estoy diseñando una aplicación en gambas 3 en el SO Ubuntu 12.04 que utiliza "Udpcast". Concretamente, ejecuto el siguiente comando utilizando Shell:

Shell ["udp-sender","-f","test.txt"]

Necesito mostrar lo que aparece en consola en un TextArea al hacer clic en un botón y que ejecute el comando, pero me está resultando imposible. He usado todo lo que he encontrado en internet
para intentar hacerlo pero no funciona de ninguna forma. Aquí os muestro lo que he intentado hasta ahora:

Forma 1:

Public Sub Button1_Click()

Dim salida As String
Shell ["udp-sender","-f","test.txt"] To salida
TextArea1.Text = salida

End


Con esta forma "salida" no muestra nada, queda vacía, mientras que si hago otro comando como "ls" si que funciona.

Forma 2:

Public Sub Button1_Click()

Dim Proceso as Process
Proceso = Shell ["udp-sender","-f","test.txt"] For Read Write

End

PUBLIC SUB Process_Read()

DIM sLine AS String

LINE INPUT #LAST, sLine

TextArea1.Text = sLine

END


Tampoco hace nada, nisiquiera entra en el método "Process_Read()", creo que esto solo sirve para versiones antiguas de Gambas.
También he probado poniendo sólo Read y sólo Write pero nada. También haciendo el comando directamente sin meterlo en un proceso.


Forma 3:

PRIVATE Proceso AS Process

PUBLIC SUB Button1_Click()
Proceso = Shell ["udp-sender","-f","test.txt"] For Read Write
END SUB

PUBLIC SUB Process_Error(sData AS String )

TextArea1.Text = sData
END SUB


Lo mismo, este método si que viene incluido en gambas 3 pero tampoco sirve, supongo que es porque no hay ningún error.


Forma 4:

Public Sub Button1_Click()

Dim Proceso as Process
Proceso = Shell ["udp-sender","-f","test.txt"] For Read Write As "Lectura"

End

PUBLIC SUB Lectura_Read()

DIM sLine AS String

LINE INPUT #LAST, sLine

TextArea1.Text = sLine

END

Y esto tampoco, no entra en el método "Lectura_Read()" y tampoco soy capaz de hacer nada con "Lectura".

Por último también he intentado guardar la salida en un archivo de texto con el comando:

udp-sender -f test.txt > prueba.txt

De esta forma el archivo queda vacío, busque sobre esto y usándolo de esta manera si que lo guarda:

udp-sender -f test.txt 2> prueba.txt

Al parecer la salida es diferente a la del resto de comandos y hay que usar el modificador "2>", pero a la hora de ponerlo en Gambas:

Shell ["udp-sender", "-f", "test.txt", "2>", "prueba.txt"]

la consola de gambas me dice que "se ha ignorado el argumento extra "2>"" y se salta el paso de guardarlo en el archivo.

Como información extra decir que en versiones anteriores de gambas el método "Process_Read()" si que funcionaba con la salida del comando "udp-sender".


Gracias de antemano por su tiempo. Saludos!

última edición por gambas yacker el Jueves, 18 Abril 2013, 21:31; editado 3 veces
Perfil MP  
Objetivo: Re: Capturar Salida Comando "udp-sender" Gambas 3
Hola y bienvenido

Si dices que en consola con el modificador 2> sí que guarda contenido en el fichero de texto, eso es porque ese comando parece dar salida por la consola de error, es decir el "stderr". No conozco lo suficiente el comando ni sé cuál debe ser su comportamiento correcto, pero eso no significa que los métodos de lectura/escritura de procesos no funcionen en gambas. Un detalle importante es la sintaxis de Shell y Exec. A Shell le puedes pasar un string con el comando completo entrecomillado, pero Exec sólo admite un array de strings con cada uno de los comandos y modificadores por separado.

Prueba lo siguiente, ya que lo que buscamos es la salida de errores:

Public Sub Button1_Click()

Dim Proceso as Process
' Sintaxis con Exec:
Proceso = Exec["udp-sender","-f","test.txt"] For Read Write As "Lectura"
' Sintaxis con Shell:
' Proceso = Shell "udp-sender -f test.txt" For Read Write As "Lectura"

End

PUBLIC SUB Lectura_Error()
' Definimos aquí el manejador de eventos de errores

DIM sLine AS String
LINE INPUT #LAST, sLine
TextArea1.Text = sLine

END


Lo normal es implementar los dos métodos, Read y Error. Prueba y nos cuentas los resultados.

Por cierto, para que el código salga coloreado en el foro, tienes que usar las etiquetas bbcode que genera el segundo botón por la izquierda "C#" code

Saludos

Perfil MP  
Objetivo: Re: Capturar Salida Comando "udp-sender" Gambas 3
El comando shell no recibe un Array de strings, eso es EXEC. Shell recibe una cadena. Tal vez eso sea motivo para el error....

Por otra parte, una posible solución (tampoco conozco ese comando) es:

Public Sub Button1_Click()

Dim salida As String

inc Application.Busy
Shell "udp-sender -f test.txt >salida.txt 2>salidaerr.txt" WAIT
dec Application.Busy
TextArea1.Text = file.load(salida.txt)
TextArea2.Text=file.load(salidaerr.txt)

End


No es lo más ortodoxo, pero en muchos comandos funciona y va genial. Depende del tiempo que tarde la Shell en soltar el proceso y si quieres ir informando paso a paso al usuario o no...

Ya nos cuentas.

Saludos

última edición por shordi el Viernes, 19 Abril 2013, 08:59; editado 3 veces
Perfil MP  
Objetivo: Re: Capturar Salida Comando "udp-sender" Gambas 3
Hola shordi, es cierto lo que dices de la sintaxis pero tengo una explicación y es que ayer se me fue la cabeza y cambie el Shell por el Exec, pero tranquilo en la aplicación estaba bien, el problema es que luego no me dejó editarlo.
He probado tu código y me creó ambos archivos, el "salida.txt" lo crea vacío y el "salidaerr.txt" me lo rellena con la salida de consola, pero el problema es que la aplicación se queda colgada y no llega a realizar el comando. He probado cambiando algunas cosillas y me da errores como el de esta línea:

TextArea1.Text = file.load(salida.txt)


Me dice que "No es un objeto", no especifica el que. Muchas gracias por la respuesta igualmente.

Gracias por la bienvenida jguardon, también he probado tu código y me daba otro error en esta línea:

Proceso = Exec ["udp-sender", "-f", "test.txt"] For Read Write As "Lectura"


El error es: "Manejador de eventos en FMain.Lectura_Error(): No hay suficientes argumentos incorrecto", pero modificando algunas cosillas al final he dado con la solución, os dejo como ha quedado:

Public Sub Button1_Click()

Dim Proceso As Process
Proceso = Exec ["udp-sender", "-f", "test.txt"] For Read Write As "Lectura"

End

Public Sub Lectura_Error(Err As String)

TextArea1.Insert(Err)

End


Parece que era bastante sencillo. Muchas gracias a los dos por las respuestas!!

última edición por gambas yacker el Viernes, 19 Abril 2013, 09:29; editado 1 vez
Perfil MP  
Objetivo: Re: Capturar Salida Comando "udp-sender" Gambas 3
El error de que no es un objeto solo puede referirse a que Textarea1 no existe o a que "salida.txt", a secas, tampoco existe. Prueba a ponerle el path absoluto del fichero... o déjalo. Si la solción de Jesús te funciona, es la correcta y ortodoxa.

Saludos

Perfil MP  

Página 1 de 1


  
No puede crear mensajes
No puede responder temas
No puede editar sus mensajes
No puede borrar sus mensajes
No puede votar en encuestas
No puede adjuntar archivos
Puede descargar archivos
No puede publicar eventos en el calendario

   

Está utilizando la versión (Lo-Fi). Para ver la versión completa del foro, haga clic aquí.

Powered by Icy Phoenix based on phpBB
Design by DiDiDaDo

Página generada en:: 0.1094s (PHP: -14% SQL: 114%)
Consultas SQL: 26 - Debug off - GZIP Activado