Portal    Foro    Buscar    FAQ    Registrarse    Conectarse


Publicar nuevo tema  Responder al tema 
Página 1 de 2
Ir a la página 1, 2  Siguiente
 
Hacer Un Proceso Separado??
Autor Mensaje
Responder citando   Descargar mensaje  
Mensaje 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
 



 
h4k - Ver perfil del usuarioEnviar mensaje privado 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje 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 
soplo - Ver perfil del usuarioEnviar mensaje privado 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje 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
 



 
h4k - Ver perfil del usuarioEnviar mensaje privado 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje 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
Private Proc as process

private $Datos as string
property read Salida as string

property read Pid as integer

private $Estado as integer
property read Estado as integer

private $Propiedad as string
property Propiedad as string

public sub _new() 'el constructor de clase inicia el proceso
   iniciar()
end

private sub _free() 'el destructor de clase termina el proceso
   terminar()
end

private function Pid_Read() as integer
   return Proc.Id
end

private function Estado_Read() as integer
return $Estado
end

private function Propiedad_Read() as string
return $Propiedad
end
private sub Propiedad_Write(Value as string)
  $Propiedad=Value
end

private function Salida_Read() as string
return $Datos
end

public sub Iniciar() 'método que inicia el proceso
   if $Estado<>proccess.running 'si no está ya en ejecución iniciarlo
      Proc=exec("...")
      $Estado=Proc.state
   endif
end

Public sub Terminar() 'método que termina el proceso
  $Estado=0 'indicar proceso parado
   try proc.kill
end

Public sub Reiniciar() 'metodo que reinicia el proceso
  Terminar()
  Iniciar()
end

Public function SacarDato() as string 'método para obtener datos calculados por el proceso
   $Estado=Proc.state
return Datos
end

Public sub MeterDatos(Dato as string)
  print #Proc,Dato
  $Estado=Proc.State
end

private sub Proc_Read()
Dim DatosTemporal as string
read #proc,DatosTemporal
$Datos &=DatosTemporal
$Estado=Proc.state
end

private sub Proc_Error(Error as string)
$Estado=Proc.state
Proc.kill
end
 


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 
soplo - Ver perfil del usuarioEnviar mensaje privado 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje 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 
h4k - Ver perfil del usuarioEnviar mensaje privado 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje 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.
 



 
soplo - Ver perfil del usuarioEnviar mensaje privado 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje 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 
h4k - Ver perfil del usuarioEnviar mensaje privado 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje 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.
 
 



 
soplo - Ver perfil del usuarioEnviar mensaje privado 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje 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
 
shordi - Ver perfil del usuarioEnviar mensaje privado 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje 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.
 
 



 
soplo - Ver perfil del usuarioEnviar mensaje privado 
Volver arribaPágina inferior
Mostrar mensajes anteriores:    
 
OcultarTemas parecidos
Tema Autor Foro Respuestas último mensaje
No hay nuevos mensajes Llamada A La Consola, Proceso: Nautilus user3304mm7126 General 5 Miercoles, 09 Diciembre 2009, 19:56 Ver último mensaje
user3304mm7126
No hay nuevos mensajes Controlar Proceso Del Ftp pittusa General 4 Viernes, 11 Febrero 2011, 05:30 Ver último mensaje
razaAztk
No hay nuevos mensajes Escribir En Un Proceso... jsbsan General 6 Domingo, 28 May 2017, 14:36 Ver último mensaje
vuott
No hay nuevos mensajes Proceso Zombie Shell Mundo Linux 0 Jueves, 23 Abril 2020, 12:05 Ver último mensaje
Shell
 

Publicar nuevo tema  Responder al tema  Página 1 de 2
Ir a la página 1, 2  Siguiente

Usuarios navegando en este tema: 0 registrados, 0 ocultos y 1 invitado
Usuarios registrados conectados: Ninguno


 
Lista de permisos
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



  

 

cron