|
Página 1 de 2
|
Hacer Un Proceso Separado??
Autor |
Mensaje |
h4k
Usuario
Registrado: Febrero 2010
Mensajes: 43
Edad: 33 Ubicación:
|
Hacer Un Proceso Separado??
Hola saludos, me presento, soy nuevo en el foro, llevo poco tiempo en gambas, pero ya me ha convencido bastante.
Tengo dos dudas principalmente. La primera consiste en algo que no se si se pueda hacer. Resulta que quiero que un módulo del programa se ejecute como un proceso aparte del programa principal, que sea independiente, cosa que si cierro la ventana principal, no se cierre el otro proceso, que actuará como Daemon. Alguna forma de hacerlo en el mismo proyecto sin tener que crear uno nuevo??
La otra duda consiste en las propiedades de los widgets, qué tengo que hacer para que la ventana se redimensione junto con los widgets?? se puede hacer de forma automática sin tener que programarlo? si no se puede, alguien me muestra un ejemplo de cómo quedaría un formulario con un botón o cualquier cosa redimensionable? se los agradecería mucho.
# Versión del Sistema operativo y de la distribución
Ubuntu 9.10
# Versión de gambas
gambas 2.16
# Entorno de escritorio
Gnome
# Componente gráfico utilizado en el proyecto (gb.gui, gb.gtk, gb.qt)
gb.gtk
|
#1 Jueves, 18 Febrero 2010, 21:10 |
|
|
soplo
Analista Programador
Registrado: Septiembre 2009
Mensajes: 843
Edad: 44
|
Re: Hacer Un Proceso Separado??
Hola
No me gusta lo que quieres hacer pero por poder se puede.
Lo que tienes que hacer es crear una clase pública y global. En ella el constructor levanta lo que tu quieras y el destructor lo cierra. El proyecto debería comenzar con una clase de inicio en el que hubiera una rutina sub main que llamara a la clase y luego a los respectivos formularios.
De esa forma consigues un arbol de formularios por debajo de esa clase. El abrir o cerrar formularios no influye para nada en esa clase global a la que puedes acudir para consultar cualquier cosa que necesites.
Te aconsejo que veas el post de clases y objetos para ver como definir propiedades y métodos propios, el constructor y destructor de clase y herencia. no es dificil. En un rato que pruebes ya lo consigues.
Gambas: de clases y objetos
Respecto al uso de procesos lee el hlo correspondiente
La clase Proccess
Un saludo
última edición por soplo el Viernes, 19 Febrero 2010, 04:46; editado 1 vez
|
#2 Viernes, 19 Febrero 2010, 04:46 |
|
|
h4k
Usuario
Registrado: Febrero 2010
Mensajes: 43
Edad: 33 Ubicación:
|
Re: Hacer Un Proceso Separado??
Hey, muchas gracias..
en cuanto a el redimensionamiento, me ha sido fácil, aunque no es muy entretenido de programar jajaja, me ha quedado así:
PUBLIC SUB Form_Resize()
TabStrip1.Width = FMain.Width - 14
TabStrip1.Height = FMain.Height - 50
Button1.X = Fmain.Width - 146
Button1.Y = Fmain.Height - 32
Button2.X = Fmain.Width - 300
Button2.Y = Fmain.Height - 32
END
No tenía idea del evento Resize, como no sabía como se llamaba el evento, no sabía como hacerlo jaja, bueno, pero la duda que aún tengo es cómo puedo hacer para que haya un valor mínimo para el redimensionamiento. Se me había ocurrido con un IF, pero no queda muy elegante... la idea es que se bloquee al intentar achicarlo a menos de cierto valor pero no se si se podrá...
En cuanto a la duda principal, intentaré con lo que me recomiendas, pero me queda la duda, por qué no te gusta lo que quiero hacer? xD
|
#3 Viernes, 19 Febrero 2010, 07:09 |
|
|
soplo
Analista Programador
Registrado: Septiembre 2009
Mensajes: 843
Edad: 44
|
Re: Hacer Un Proceso Separado??
Te pongo un ejemplo
En un módulo (que pones como clase de inicio) haces esto
public sub main()
Public C as new ClaseProceso 'con esto se inicia el proceso
private F as new FormPrincipal
C.propiedad="algún parámetro que le quieras pasar"
f.show 'Con esto llamo a un formulario principal
C.Delete 'con esto termino el proceso
end
La clase ClaseProceso sería algo como esto
Tienes una propiedad de tipo string donde puedes meter un valor, una propiedad de solo lectura 'estado' que te dice el estado en que está tu proceso, el pid del proceso un método iniciar que inicia el proceso, uno de terminar que lo termina, uno de SacarDatos que devuelve los datos que ha devuelto hasta ese instante el proceso y uno de MeterDatos que envía al proceso algún dato.
última edición por soplo el Viernes, 19 Febrero 2010, 08:05; editado 2 veces
|
#4 Viernes, 19 Febrero 2010, 07:59 |
|
|
h4k
Usuario
Registrado: Febrero 2010
Mensajes: 43
Edad: 33 Ubicación:
|
Re: Hacer Un Proceso Separado??
Gracias, deberían poner eso como un tutorial en el wiki o algo jaja
Sólo que no es exactamente lo que necesito, me he dado cuenta que la solución a mi problema sería ejecutar una función en segundo plano en vez de crear otro proceso. Algo así como funciona el SHELL y el EXEC por default. Si no le pones WAIT, entonces la aplicación no esperará a que la orden se ejecute.. necesito eso masmenos pero para una función... que al apretar un botón, una función se ejecute en segundo plano y que el form principal no espere a que se termine de ejecutar. Alguna idea?
Gracias.
EDIT: Me di cuenta que la aplicación se pegaba porque usaba SLEEP, lo solucioné usando WAIT. Ahora si funciona sin que la aplicación se pegue, pero si quiero hacer otra cosa, como por ejemplo, dejarlo en el system tray, o presiono otro botón que realiza otra tarea, la aplicación tira error.
última edición por h4k el Viernes, 19 Febrero 2010, 22:44; editado 2 veces
|
#5 Viernes, 19 Febrero 2010, 21:42 |
|
|
soplo
Analista Programador
Registrado: Septiembre 2009
Mensajes: 843
Edad: 44
|
Re: Hacer Un Proceso Separado??
Citar: Sólo que no es exactamente lo que necesito, me he dado cuenta que la solución a mi problema sería ejecutar una función en segundo plano en vez de crear otro proceso. Algo así como funciona el SHELL y el EXEC por default. Si no le pones WAIT, entonces la aplicación no esperará a que la orden se ejecute.. necesito eso masmenos pero para una función... que al apretar un botón, una función se ejecute en segundo plano y que el form principal no espere a que se termine de ejecutar. Alguna idea?
Eso es exactamente lo que hace ese código.
|
#6 Sabado, 20 Febrero 2010, 04:19 |
|
|
h4k
Usuario
Registrado: Febrero 2010
Mensajes: 43
Edad: 33 Ubicación:
|
Re: Hacer Un Proceso Separado??
Creo que ya voy entendiendo el asunto, pude ejecutar el form como un proceso diferente, pero no pude ejecutar un módulo como otro proceso diferente si es que pongo la declaración de la variable dentro de un IF por ejemplo.
Yo buscaba algo así, pero bueno xD
http://msdn.microsoft.com/es-es/library/8xs8549b%28VS.80%29.aspx
última edición por h4k el Sabado, 20 Febrero 2010, 06:40; editado 1 vez
|
#7 Sabado, 20 Febrero 2010, 05:57 |
|
|
soplo
Analista Programador
Registrado: Septiembre 2009
Mensajes: 843
Edad: 44
|
Re: Hacer Un Proceso Separado??
A ver
Tu defines una variable de tipo proceso. Donde y como la definas determinará su ámbito y ciclo de vida. Si la declaras como global en un módulo pues será conocida en todo momento en la aplicación.
Mira la función main
public sub main()
Public C as new ClaseProceso 'con esto se inicia el proceso
private F as new FormPrincipal
C.propiedad="algún parámetro que le quieras pasar"
f.show 'Con esto llamo a un formulario principal
C.Delete 'con esto termino el proceso
end
Lo primero que haces es instanciar la clase C. Esa clase instanciada hará algo. Posteriormente sacas un formulario principal que es lo que el usuario ve.
Al instanciar esa clase se llama al constructor que es este método especial
public sub _new() 'el constructor de clase inicia el proceso
iniciar()
end
Ocurre de forma automática osea que solo por instanciarla ya has ejecutado el método Iniciar que inicia tu proceso
Tu instanciaste y mostraste un formulario. Lo que ocurre es que se inició un proceso y se mostró un formulario principal al usuario. El usuario elige opciones en su aplicación y el proceso sigue corriendo porque no le pusiste wait al exec así que corre en segundo plano.
Puede ocurrir que entre las opciones que elige el usuario quieras alguna información de lo que está pasando. La propiedad Pid te devuelve el Pid de tu proceso y la propiedad Estado te dice si está corriendo, parado o se interrumpió por un error.
Igualmente C tiene algunos métodos que te permiten parar tu proceso, reiniciarlo o iniciarlo si paró por un error. Además toda la salida que ese proceso está generando queda en la propiedad Salida.
Antes o despues y de una forma u otra tu quieres terminar definitivamente ese proceso. Para ello haces C.delete si lo quieres matar o bien si lo declaraste en una función por ejemplo cuando acaba su ámbito muere. En el momento en que esa clase muere se llama al destructor de clase que este
private sub _free() 'el destructor de clase termina el proceso
terminar()
end
que termina lo que empezaste y cierra cualquier cosa que hubieras hecho antes para que todo quede bien
Yo creo que no entiendes bien lo que hace esa clase de ejemplo.
|
#8 Sabado, 20 Febrero 2010, 15:53 |
|
|
shordi
Analista Programador
Registrado: Septiembre 2009
Mensajes: 4982
Edad: 64 Ubicación: Albacete
|
Re: Hacer Un Proceso Separado??
Yo creo, soplo, que lo que él quiere es que su "subpoceso" siga rulando aunque cierres el proceso principal. Todavía no he analizado el código que has subido (a pesar de que tengo que hacer algo parecido en breve), pero dado cómo plantea h4k el problema, quizá todo se le solucionase de forma sencilla si lanza el proceso desde un comando shell y añadiendo el clásico & al final . Algo así como:
Shell misubprograma.gambas &
y ya está...
=================== No podemos regresar
|
#9 Sabado, 20 Febrero 2010, 20:29 |
|
|
soplo
Analista Programador
Registrado: Septiembre 2009
Mensajes: 843
Edad: 44
|
Re: Hacer Un Proceso Separado??
Shordi el poner el & en la shell es lo mismo que no poner el WAIT en gambas. Es una forma de indicar en un entorno u otro si el proceso que lanzas debe ir en primer o segundo plano.
El caso es que si tu lanzas un proceso en segundo plano (que irá a su rollo) y como tu programa continúa en lo suyo ofreces un formulario al usuario pues el usuario estará usando sus opciones y entre tanto el proceso seguirá a lo suyo. No hay nada mas.
Esa clase es amplia porque le he puesto varias propiedades de ejemplo y varios métodos para iniciar, parar y reiniciar pero no son fundamentales. Lo único fundamental es que al hacer en la aplicación principal el DIM ... NEW en la clase se ejecuta el _NEW y si allí se lanza un proceso en segundo plano pues irá a lo suyo sin mas y con independencia de que el usuario esté eligiendo unas u otras opciones en sus formularios.
Así que en vez de leer todo eso mira como se declara la variable
Dim C as NEW ClaseProceso
y lo que hace el constructor en la clase
public sub _NEW()
que lo que hace es iniciar un proceso en segundo plano. Exactamente lo que el quiere.
|
#10 Domingo, 21 Febrero 2010, 01:42 |
|
|
|
Temas parecidos
Temas parecidos
|
Página 1 de 2
|
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
|
|
|
|
|