Autor |
Mensaje |
obedlink
Usuario
Registrado: Marzo 2013
Mensajes: 13
Edad: 38
|
Como Responder A La Peticion De Un Comando De Consola?
Hola soy nuevo en el foro y tengo poco conocimiento de programación en basic, al menos se jugar un poco con las propiedades de los objetos
bueno al grano, estoy haciendo una aplicación grafica para el driver xboxdrv (controlador para xbox 360).
Public Sub botonpad1_Click()
If botonpad1.Value = True Then
botonpad1.Text = "Activado"
Shell ("xboxdrv --wid 0 --silent --detach-kernel-driver --mimic-xpad")
Endif
If botonpad1.Value = False Then
botonpad1.Text = "Desactivado"
Shell (¿que comando uso para responder Crtl+c en el proceso anterior?)
Endif
End
como veran el comando es "xboxdrv --wid 0 --silent --detach-kernel-driver --mimic-xpad" y activa el driver para poder usar el control, pero este mismo al meterlo en consola al final dice "precione Ctrl+C" para terminar el proceso"
¿como hago para que ingresar ese Ctrl+C mediante un boton?, si cierro la aplicación el comando queda ejecutandose.
esta pregunta es parecida a por ejemplo si ejecuto el comando "apt-get upgrade", como hago para indicar el [S/n]? para proceder Si/No con la actualización.
|
#1 Lunes, 18 Marzo 2013, 19:05 |
|
|
sebikul
Sebastian
Programador
Registrado: Julio 2012
Mensajes: 113
Edad: 30 Ubicación:
|
Re: Como Responder A La Peticion De Un Comando De Consola?
Public Sub botonpad1_Click()
If botonpad1.Value = True Then
botonpad1.Text = "Activado"
Shell ("xboxdrv --wid 0 --silent --detach-kernel-driver --mimic-xpad")
Endif
If botonpad1.Value = False Then
botonpad1.Text = "Desactivado"
Shell (¿que comando uso para responder Crtl+c en el proceso anterior?)
Endif
End
Dime si te funciona!
última edición por sebikul el Lunes, 18 Marzo 2013, 19:11; editado 1 vez
|
#2 Lunes, 18 Marzo 2013, 19:11 |
|
|
obedlink
Usuario
Registrado: Marzo 2013
Mensajes: 13
Edad: 38
|
Re: Como Responder A La Peticion De Un Comando De Consola?
Public Sub botonpad1_Click()
If botonpad1.Value = True Then
botonpad1.Text = "Activado"
Shell ("xboxdrv --wid 0 --silent --detach-kernel-driver --mimic-xpad")
Endif
If botonpad1.Value = False Then
botonpad1.Text = "Desactivado"
Shell (¿que comando uso para responder Crtl+c en el proceso anterior?)
Endif
End
Dime si te funciona!
me da el error "objeto nulo"
|
#3 Lunes, 18 Marzo 2013, 20:29 |
|
|
sebikul
Sebastian
Programador
Registrado: Julio 2012
Mensajes: 113
Edad: 30 Ubicación:
|
Re: Como Responder A La Peticion De Un Comando De Consola?
me da el error "objeto nulo"
El código anterior era una "pista" para acercarte a la solución correcta. Lee la documentacion para saber bien como se manejan los procesos.
|
#4 Lunes, 18 Marzo 2013, 20:38 |
|
|
obedlink
Usuario
Registrado: Marzo 2013
Mensajes: 13
Edad: 38
|
Re: Como Responder A La Peticion De Un Comando De Consola?
ok amigo
encontre la solucion parcial, hay que declarar la variables oDriver fuera del sub-proceso como ves en el codigo, si reemplazo el comando xboxdrv por dolphin para abrir el navegador de archivos dolphin, el comando .kill() si funciona pero con el comando xboxdrv no funciona, ni siquiera matando (Kill) el progreso en consola mediante "Editar--Enviar señal---matar la tarea" ni siquiera con "Terminar la tarea (TERM).
|
#5 Miercoles, 20 Marzo 2013, 01:28 |
|
|
Enchufadoo
Aprendiz
Registrado: Agosto 2010
Mensajes: 50
Edad: 37 Ubicación:
|
Re: Como Responder A La Peticion De Un Comando De Consola?
Hola, me parece que la razón por la que no podes matarlo es por que el programa fue ejecutado con sudo, y necesitas permisos de superusuario para matarlo
oDriver = Shell ("echo " & clave & "| sudo -S gedit")
Probá con este programa y no te va a funcionar matarlo
Creo que vas a tener que correr tu programa de gambas con permisos de superusuario, o lo otro que se me ocurre es que mates al proceso con otro shell:
Shell ("echo " & clave & "| sudo killall xboxdrv")
Pero eso requiere que pidas de nuevo la contraseña o que la guardes (no se si es un riesgo de seguridad), y también tenes que tener cuidado por que eso mata a otras instancias xboxdrv.
Respecto a enviar un atajo de teclado a un programa, existe en el ejemplo de reproductor de películas que viene con gambas una parte del código donde le enviá un "espacio" para pausar la reproducción del video con Print pero enviar algo como "ctrl c" nunca vi.
Saludos.
|
#6 Miercoles, 20 Marzo 2013, 14:46 |
|
|
sebikul
Sebastian
Programador
Registrado: Julio 2012
Mensajes: 113
Edad: 30 Ubicación:
|
Re: Como Responder A La Peticion De Un Comando De Consola?
Hola, me parece que la razón por la que no podes matarlo es por que el programa fue ejecutado con sudo, y necesitas permisos de superusuario para matarlo
oDriver = Shell ("echo " & clave & "| sudo -S gedit")
Probá con este programa y no te va a funcionar matarlo
Creo que vas a tener que correr tu programa de gambas con permisos de superusuario, o lo otro que se me ocurre es que mates al proceso con otro shell:
Shell ("echo " & clave & "| sudo killall xboxdrv")
Pero eso requiere que pidas de nuevo la contraseña o que la guardes (no se si es un riesgo de seguridad), y también tenes que tener cuidado por que eso mata a otras instancias xboxdrv.
Respecto a enviar un atajo de teclado a un programa, existe en el ejemplo de reproductor de películas que viene con gambas una parte del código donde le enviá un "espacio" para pausar la reproducción del video con Print pero enviar algo como "ctrl c" nunca vi.
Saludos.
En primer lugar, debería funcionar .Kill() sin sudo ya que el proceso padre ( gambas) lo esta matando, no una aplicación del espacio del usuario (como kill o un administrador de tareas). Por otro lado, no deberías usar killall. Con Process.Handle puedes saber el pid del proceso y ejecutar:
Exec["kill", "-9", oDriver.Handle]
* Depende de como ejecutaste el proceso en un principio si debes incluir sudo o no.
Finalmente, según la documentación de xboxdrv debería funcionar en el espacio de usuario, por lo tanto sudo no debería ser requerido. Si podría pasar que por algún tema de configuración (udev mas que nada) solo root este autorizado a acceder al dispositivo, pero esto depende del sistema.
Con respecto al Ctrl + C, no se trata de enviar algún dato al proceso sino enviarle una señal. (Hay mucha info de esto en Internet)
|
#7 Miercoles, 20 Marzo 2013, 21:10 |
|
|
obedlink
Usuario
Registrado: Marzo 2013
Mensajes: 13
Edad: 38
|
Re: Como Responder A La Peticion De Un Comando De Consola?
gracias por la ayuda, me puse a invertigar lo del comando kill+id del proceso y funciona perfectamente, el killall no me sirve porque como dices mata todos los procesos y yo pienso usar hasta 4 procesos iguales a la vez, pero tengo que decirte que si hay que hacerlo con root. por ejemplo:
si en una konsola ejecuto "sudo xboxdrv" para terminarlo el comando kill + el id tengo que meterlo con sudo tambien.
ahora el problema es que no puede hacerlo en gambas
con este codigo
Shell "echo " & clave & "|sudo -S kill" & oDriver.Handle
me da este error: sudo: kill14862: orden no encontrada
obiamente falta un espacio entre kill y el numero para quedar asi "kill 14862" pero al darle el espacio de esta forma:
Shell "echo " & clave & "|sudo -S kill " & oDriver.Handle
el comando no hace nada ni devuelve ningun error.
|
#8 Sabado, 23 Marzo 2013, 02:21 |
|
|
sebikul
Sebastian
Programador
Registrado: Julio 2012
Mensajes: 113
Edad: 30 Ubicación:
|
Re: Como Responder A La Peticion De Un Comando De Consola?
Debes usar
Shell "echo -n " & ...
No da error porque la contraseña para sudo es incorrecta, con -n evitas que echo añada un final de linea.
|
#9 Sabado, 23 Marzo 2013, 04:35 |
|
|
|