|
Página 2 de 3
|
La Clase Desktop Y Aplicaciones Embebidas
Autor |
Mensaje |
fabianfv
Analista Programador
Registrado: Octobre 2009
Mensajes: 495
Edad: 50 Ubicación:
|
Re: La Clase Desktop Y Aplicaciones Embebidas
Citar:
Supongo que lo mejor será llamar al proceso y utilizar un componente Timer para localizarlo con un Desktop.Find
Bastaría con un simple bucle con una instrucción WAIT.
Citar:
porque si lo haces con un bucle y la llamada al proceso no tiene éxito te puedes quedar clavado.
Supongo que "la llamada al proceso" significa: EXEC["gnome-terminal"] . Esta instrucción no debe estar dentro del bucle (que es sólo para dar tiempo a que la carga del programa haya concluido y así Desktop.Find pueda encontrar el id XWindow del proceso.
Debería ser algo así:
'escribo sólo el código para el bucle
DIM Counter AS Byte = 0
'Para evitar errores con el array puntero es mejor inicializarlo explicitamente (DIM puntero AS NEW Pointer[])
'de lo contrario puntero podría ser nulo al momento de realizar la comparación (lo que generaría un error en tiempo de ejecución)
WHILE Counter < 50 OR puntero.Count = 0
WAIT 0.005
Desktop.Find("","*gnome-terminal*","")
Counter += 1
WEND
=================== Cómo programar con Gambas
Speed Books: informática libre.
|
#11 Viernes, 27 Noviembre 2009, 19:20 |
|
|
Steve
Usuario
Registrado: Noviembre 2009
Mensajes: 6
Edad: 44
|
Re: La Clase Desktop Y Aplicaciones Embebidas
Muchas gracias por vuestras respuestas.
De todos modos sigo sin poder embedir un terminal en mi form, de hecho, mis conocimientos de gambas no son muchos, y quizás mi error es trivial, por este motivo, os copio a continuación mi SUB del objeto que pretendo embeder.
PUBLIC SUB Embedder1_Embed()
DIM Counter AS Byte = 0
'Para evitar errores con el array puntero es mejor inicializarlo explicitamente (DIM puntero AS NEW Pointer[])
'de lo contrario puntero podría ser nulo al momento de realizar la comparación (lo que generaría un error en tiempo de ejecución)
DIM puntero AS NEW Pointer[]
DIM ipuntero AS Integer
DIM Proceso AS Process
WHILE Counter < 50 OR puntero.Count = 0
WAIT 0.005
Desktop.Find("", "*gnome-terminal*", "")
Counter += 1
WEND
Proceso = EXEC ["gnome-terminal"] 'iniciar el proceso gnome terminal
ipuntero = proceso.handle 'quedarme con su handle
Embedder1.Embed(ipuntero) 'embeberlo
END
Mi otra alternativa, es hacer el embed via Glade+C+GTK, (mediante la libreria VTE) cosa que si he conseguido, pero no puede compararse ni de lejos, la rapidez con que podrian actualizarse viejas aplicaciones de consola, haciendo GUI's de terminales embedidas en gambas. Vaya, un sueño casi. En todo caso, y que yo sepa, no he visto ningun binding de dicha libreria (VTE) para gambas.
|
#12 Miercoles, 09 Diciembre 2009, 17:48 |
|
|
fabianfv
Analista Programador
Registrado: Octobre 2009
Mensajes: 495
Edad: 50 Ubicación:
|
Re: La Clase Desktop Y Aplicaciones Embebidas
Steve, cuando escribes un mensaje al foro utiliza el primer icono C# antes y después del código que expongas para que quede resaltada la sintaxis y se más fácil de leer.
En cuanto a tu código el problema es trivial tal como tu mismo lo dices, intentas encontrar el handle de una ventana con el método Desktop.Find antes de ejecutar la terminal. Cambia el orden, primero la sentencia EXEC, luego el bucle con el método Desktop.Find.
Hay un par de errores más en tu código:
- Esta sentencia perderá el handle de la ventana que encuentre:
Desktop.Find("", "*gnome-terminal*", "")
Reemplazala con:
puntero = Desktop.Find("", "*gnome-terminal*", "")
Ahora el array "puntero" contiene todos los punteros (handle) a las ventanas de gnome-terminal abiertas.
- Esta sentencia es errónea (obtiene el pid del proceso en vez del handle XWindow)
ipuntero = proceso.handle 'quedarme con su handle
Reemplazala por:
Eso es todo.
=================== Cómo programar con Gambas
Speed Books: informática libre.
|
#13 Miercoles, 09 Diciembre 2009, 18:36 |
|
|
Steve
Usuario
Registrado: Noviembre 2009
Mensajes: 6
Edad: 44
|
Re: La Clase Desktop Y Aplicaciones Embebidas
Nuevamente gracias. Pese a todo, sigo sin poder obtener el resultado. Al correr la aplicación, mi formulario sigue en blanco y el objeto Embedder1 no es visible. Ignoro si en SUB _new() o en SUB Form_Open() deberia especificar algo mas. Tb lo he probado con gnome-terminal corriendo y sin. Es preciso tener proceso gnome-terminal ejecutándose?
El código del objeto a embedir, con las indicaciones que en el anterior me dabas, quedaria como sigue:
PUBLIC SUB Embedder1_Embed()
DIM Counter AS Byte = 0
'Para evitar errores con el array puntero es mejor inicializarlo explicitamente (DIM puntero AS NEW Pointer[])
'de lo contrario puntero podría ser nulo al momento de realizar la comparación (lo que generaría un error en tiempo de ejecución)
DIM puntero AS NEW Pointer[]
DIM ipuntero AS Integer
DIM Proceso AS Process
Proceso = EXEC ["gnome-terminal"] 'iniciar el proceso gnome terminal
WHILE Counter < 50 OR puntero.Count = 0
WAIT 0.005
puntero = Desktop.Find("", "*gnome-terminal*", "")
Counter += 1
WEND
ipuntero = puntero[0]
Embedder1.Embed(ipuntero) 'embeberlo
END
última edición por Steve el Jueves, 10 Diciembre 2009, 12:33; editado 2 veces
|
#14 Jueves, 10 Diciembre 2009, 12:31 |
|
|
fabianfv
Analista Programador
Registrado: Octobre 2009
Mensajes: 495
Edad: 50 Ubicación:
|
Re: La Clase Desktop Y Aplicaciones Embebidas
'Este codigo no debe ir en el evento Embed del control Embedder
'PUBLIC SUB Embedder1_Embed()
PUBLIC SUB Button1_Click()
DIM Counter AS Byte = 0
DIM puntero AS NEW Pointer[]
DIM ipuntero AS Integer
DIM Proceso AS Process
Proceso = EXEC ["gnome-terminal"]
'Aquí hay otro error que provocaría un bucle infinito
'WHILE Counter < 50 OR puntero.Count = 0
WHILE Counter < 50 AND puntero.Count = 0
'Si aún la ventana aún no se incrusta puede aumentar este valor: WAIT 0.05
WAIT 0.005
puntero = Desktop.Find("", "*gnome-terminal*", "")
Counter += 1
WEND
IF puntero.count = 1 THEN
ipuntero = puntero[0]
ENDIF
Embedder1.Embed(ipuntero)
END
=================== Cómo programar con Gambas
Speed Books: informática libre.
|
#15 Jueves, 10 Diciembre 2009, 14:53 |
|
|
Steve
Usuario
Registrado: Noviembre 2009
Mensajes: 6
Edad: 44
|
Re: La Clase Desktop Y Aplicaciones Embebidas
Sigamos... xD! Ahora me dice Unknown Symbol 'Find' in the Class 'Destkop'
Y me abre el gnome-terminal pero no embedido en el form, sinó lanzado aparte...
Ahora copio toda el listado de mi Fmain.class a ver...
' gambas class file
PUBLIC SUB _new()
END
PUBLIC SUB Form_Open()
END
PUBLIC SUB Button1_Click()
'Este codigo no debe ir en el evento Embed del control Embedder
'PUBLIC SUB Embedder1_Embed()
DIM Counter AS Byte = 0
DIM puntero AS NEW Pointer[]
DIM ipuntero AS Integer
DIM Proceso AS Process
Proceso = EXEC ["gnome-terminal"]
'Aquí hay otro error que provocaría un bucle infinito
'WHILE Counter < 50 OR puntero.Count = 0
WHILE Counter < 50 AND puntero.Count = 0
'Si aún la ventana aún no se incrusta puede aumentar este valor: WAIT 0.05
WAIT 0.05
puntero = Desktop.Find("", "*gnome-terminal*", "")
Counter += 1
WEND
IF puntero.count = 1 THEN
ipuntero = puntero[0]
ENDIF
Embedder1.Embed(ipuntero)
END
PUBLIC SUB Embedder1_Embed()
END
última edición por Steve el Jueves, 10 Diciembre 2009, 15:31; editado 1 vez
|
#16 Jueves, 10 Diciembre 2009, 15:31 |
|
|
fabianfv
Analista Programador
Registrado: Octobre 2009
Mensajes: 495
Edad: 50 Ubicación:
|
Re: La Clase Desktop Y Aplicaciones Embebidas
Citar:
Ahora me dice Unknown Symbol 'Find' in the Class 'Destkop'
Es porque tienes que habilitar el componente gb.Desktop:
Proyecto > Propiedades > Componentes
=================== Cómo programar con Gambas
Speed Books: informática libre.
|
#17 Jueves, 10 Diciembre 2009, 15:36 |
|
|
Steve
Usuario
Registrado: Noviembre 2009
Mensajes: 6
Edad: 44
|
Re: La Clase Desktop Y Aplicaciones Embebidas
Ok, bien! El terminal ya se incrustra correctamente. Ahora solo falta activar el 'focus' (el prompt ok, pero no deja escribir en el aun) y saber como lanzar una aplicación; por ejemplo lanzar el editor Vim.
Bajando el wait a 0.05 nos nos ahorramos ciertamente el lanzamiento de otro terminal 'real'.
Sabiendo eso, el resto del proyecto se completaria casi automaticamente; Se trata de aprovechar aplicaciones de consola 'a-medida', lanzandolas via menus del GUI de la aplicacion, o botones es igual. A mi parece algo tremendamente util... Hace unos años el powershell y el multi-gnome-terminal hacian eso, pero las librerias que utilizaban estan ahora 'deprecated' ...
gracias,
Steve,
Citar:
Ahora me dice Unknown Symbol 'Find' in the Class 'Destkop'
Es porque tienes que habilitar el componente gb.Desktop:
Proyecto > Propiedades > Componentes
|
#18 Jueves, 10 Diciembre 2009, 16:17 |
|
|
fabianfv
Analista Programador
Registrado: Octobre 2009
Mensajes: 495
Edad: 50 Ubicación:
|
Re: La Clase Desktop Y Aplicaciones Embebidas
Citar:
Ahora solo falta activar el 'focus' (el prompt ok, pero no deja escribir en el aun)
Seguramente estás usando el componente gb.gui o gb.gtk, lamento decirte que el comportamiento que citas parece ser un bug en la implementación del componente GTK (o bien la biblioteca GTK no cumple el protocolo XEmbed).
Si activas gb.qt verás que ese problema desaparece.
Citar:
y saber como lanzar una aplicación; por ejemplo lanzar el editor Vim.
Ya lo sabes, usas EXEC o SHELL. En el libro " gambas, programación visual con software libre" disponible en la sección de descargas, hay un capítulo completo dedicado a la gestión de procesos.
Citar:
Bajando el wait a 0.05 nos nos ahorramos ciertamente el lanzamiento de otro terminal 'real'.
No entiendo que quieres decir.
=================== Cómo programar con Gambas
Speed Books: informática libre.
|
#19 Jueves, 10 Diciembre 2009, 18:05 |
|
|
Steve
Usuario
Registrado: Noviembre 2009
Mensajes: 6
Edad: 44
|
Re: La Clase Desktop Y Aplicaciones Embebidas
Efectivamente, activando gb.qt y desactivando los otros 2, la cosa funciona mejor.
Tb puedo lanzar ahora, exec y shell, diferentes aplicaciones.
Pese a todo, el funcionamento es algo inestable; el foco se 'pierde'. Si el tiempo del wait es menor a 0.05 (por ejemplo 0.005) suele lanzar otra terminal no-incrustada. Y tambien, a partir del segundo o tercer F5, aun se vuelve mas inestable. En cambio, cuando funciona, la terminal es bastante rapida.
Pese a todo agradezco mucho la ayuda. En todo caso, propongo que en futuras versiones de gambas se implemente binding de la libreria Vte.h en el que se pueda interaccionar de-hacia los objetos graficos hacia-de la terminal. Actualmente no hay ni un solo RAD que lo haga posible. Ni siquiera en Glade existe VTE com widget, y hay que implementarlo.
Os imaginais la cantidad de aplicaciones 'vintage' de los dias de 'solo-consola' que podrian actualizarse via menus hibridos?
gracias,
Steve,
última edición por Steve el Viernes, 11 Diciembre 2009, 13:08; editado 1 vez
|
#20 Viernes, 11 Diciembre 2009, 13:08 |
|
|
|
Temas parecidos
Temas parecidos
|
Página 2 de 3
|
Usuarios navegando en este tema: 0 registrados, 0 ocultos y 1 invitado Usuarios registrados conectados: Ninguno
|
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
|
|
|
|
|