Page 1 of 1

Monitorear/Visualizar arranque de la aplicacion ( How to )

Posted: Tue Aug 19, 2008 1:47 am
by Raymundo Islas M.
Hola a Todos,

Tengo la siguiente curiosidad :

En la app que estoy ajustando/depurando, al momento de ejecutarla muestro un dialogo que indica el avance en la creacion de archivos indices ( si estos no existen ) y como todos sabemos segun sea el tamaño de los archivos sera el tiempo usado para tal fin y con el Progress los usuarios ven que tanto falta para que acabe el proceso.
Esto lo hago en el Init Procedure.

Ahora, cuando la funcion Main() toma control empiezo a "levantar" la aplicacion : definir el Folder principal, los controles de cada pestaña, obtener los datos de algunos arreglos, etc, etc.
Esto toma algunos segundos ( 2 a 3 ) en el caso de la Pc Servidor ya que tiene los archivos y ( 5 a 6 ) en las Pcs terminales via lan.

Y durante este lapso ( que para algunos usuarios que son desesperados e impacientes ) como no ven nada en la pantalla, piensan que no se esta ejecutando la app o que ya se congelo la Pc.

Me gustaria mostrar con un progress algo que indique el avance de como la App se esta "armando" para que sepan cuanto falta, el detalle que todo esto se hace en la funcion Main(), cosa que complica la situacion.

Ya probe sacando todo eso de la Main() y pasarla a otra Funcion, pero nop, no le encuentro.

Alguien que pueda darme una poca de luz.


Gracias de antemano.


Saludos

Posted: Tue Aug 19, 2008 2:20 am
by Willi Quintana
Lo hago asi:

// inicio del prgrama

oObjT := AvisoConexion("Analizando la Base de Datos,,,", 1, cTitle)
HazFunction1()
oObjT:End()
oObjT := AvisoConexion("Verificando Integridad,,,", 66, cTitle)
HazFunction2()
oObjT:End()
oObjT := AvisoConexion("Abriendo Base de Datos,,,", 66, cTitle)
HazFunction3()
oObjT:End()

DEFINE ICON oIcon RESOURCE "SVITE"
DEFINE CURSOR oCursor HAND
DEFINE BRUSH oBrush FILENAME oApp:iLogo
DEFINE WINDOW oWnd MDI .......................................


//--------------------------------
Function AvisoConexion(cSay, nAva, cTitle)
local oDlgAv, oSay, oEka, oMySQL
local oPMeter, vPMeter, oFont
DEFAULT cTitle := ""

vPMeter := nAva

cTitle := IF(EMPTy(cTitle),"SVITE...", cTitle)

DEFINE FONT oFont NAME "Arial" BOLD SIZE 7,16
DEFINE DIALOG oDlgAv RESOURCE "MYSQL" TITLE cTitle

REDEFINE BTNBMP oEka ;
RESOURCE "EKA0" NOBORDER ;
ID 103 OF oDlgAv
REDEFINE BTNBMP oMySql ;
RESOURCE "MYSQL" NOBORDER ;
ID 104 OF oDlgAv
REDEFINE SAY oSay ;
VAR cSay ;
FONT oFont ;
COLOR CLR_RED ;
ID 101 OF oDlgAv
REDEFINE METER oPMeter ;
VAR vPMeter ID 102 OF oDlgAv

ACTIVATE DIALOG oDlgAv ;
CENTER NOWAIT ;
ON INIT (oPMeter:SET( nAva ) )
oFont:End()

Return( oDlgAv )

//---------------------------------------------------------
Salu2

Posted: Tue Aug 19, 2008 2:36 am
by Armando
Ray:

Podría servirte la función Mssgrun() ?

MsgRun( "Mensaje...",, {|| Funcion() } )

Saludos

Re: Monitorear/Visualizar arranque de la aplicacion ( How to

Posted: Tue Aug 19, 2008 4:05 am
by FranciscoA
¿Te sirve esto?

ACTIVATE WINDOW oWnd MAXIMIZED ;
ON INIT ( MsgRun("Iniciando Sistema",,{||INICIO()}) )

Posted: Tue Aug 19, 2008 2:45 pm
by Raymundo Islas M.
Gracias Compañeros por las sugerencias,

Hare pruebas al respecto, de inicio mi intencion era tratar de hacerlo desde un dialogo para mostrar varios progress, pero creo que al final y dependiendo de los resultados, tendria que usar el MsgRun aunque sea solo algun texto.

Willi, de alguna manera la forma que comentas es parecida a la que tengo actualmente, el detalle ( sorry, creo que no lo dije ) es que estoy usando un dialogo como pantalla principal y no una ventana y dentro de dicho dialogo construyo todo.


Muchas Gracias


Saludos

Posted: Tue Aug 19, 2008 3:38 pm
by Alfredo Arteaga
Una opción mas:

Consiste en mostrar un díalogo con la imagen o logo del sistema hasta que se encuentre la estabilidad de la aplicación.

Code: Select all

   -Definición de variables globales y entorno principal
   lInit:=.T.
   ...
   // Solo muestra imagen del sistema
   DEFINE DIALOG oDlc RESOURCE "CARGANDO"
   REDEFINE IMAGE oImg RESOURCE "Carga" ID 100 OF oDlc ADJUST
   REDEFINE SAY oSay PROMPT "Cargando el sistema, espere..." CENTER ID 110 OF oDlc
   ACTIVATE DIALOG oDlc NOWAIT CENTERED
   ...
   - Identificación del ambiente, rutas, permisos, derechos, etc.
   - Construcción de ventana principal
   ...
   ACTIVATE WINDOW oWnd            ;
      ON PAINT Paint_Wnd(hDC,oDlc) ;
      ON INIT  Init_Wnd(...,oDlc:End())  ;
      VALID    End_Wnd(...)

STAT FUNC Paint_Wnd(hDC,oDlc)
   - Coloca Brush o imagen de fondo, ajusta ventana según pantalla y/o resolución usada

   // Vuelve a mostrar el diálogo de carga sobre la ventana ya creada,
   // sucede que todavía le falta estabilizarse y puede tardar varios
   // segundos, mas cuando es la primera vez que se ejecuta la
   // aplicación.
   IF lInit
      oDlc:SetFocus()
      SysRefresh()
      CursorWait()
      lInit:=.F.
   ENDIF

RETURN (NIL)

Posted: Tue Aug 19, 2008 10:03 pm
by Raymundo Islas M.
Alfredo,

Es exactamente lo que andaba queriendo hacer !!!


Quedo perfecto !!!


:P


Muchas Gracias por tu opcion.


Saludos

Posted: Wed Aug 20, 2008 12:53 am
by mmercado
Hola Raymundo:

Una alternativa más, podrías usar un objeto TAnimate, checa Win32.prg en \FWH\Samples.

Saludos.

Manuel Mercado.

Posted: Wed Aug 20, 2008 2:10 am
by Raymundo Islas M.
Excelente alternativa Maestro Mercado !!

Tambien andaba buscando ese ejemplo con los avi, solo que no recordaba en que archivo se encuetra.


Agradezco enormemente a todos por sus atenciones.


Saludos

Posted: Wed Aug 20, 2008 8:45 pm
by TecniSoftware
En mi caso, yo ejecuto multiples operaciones ANTES de crear la ventana principal y me gustaría agregar un mensaje de espera mientras se van ejecutando, tal como mencionaban.
Quisiera mostrar un dialogo y como decía Manuel, con una animacion, pero veo que no es posible mostrar un dialogo sin antes crear una ventana.
Hay alguna manera de hacerlo sin ventana o si se puede crear una ventana de manera invisible y luego cerrarla cuando hayan finalizado los procesos?

Desde ya, muchas gracias!

Posted: Thu Aug 21, 2008 3:02 am
by Alfredo Arteaga
Alejando, si es posible crear diálogos. Prueba este código:

Code: Select all

#Include "FiveWin.Ch" 

FUNCTION Main() 
   LOCAL oWnd, lInit:=.T., oDlg, oSay, cSay 

   cSay:="Loading, please wait..." 

   DEFINE DIALOG oDlg FROM 0, 0 TO 5,40 
   @ 1, 1 SAY oSay PROMPT cSay CENTERED 
   ACTIVATE DIALOG oDlg NOWAIT CENTERED 
   SysRefresh() 
   WaitSeconds(2) 

   DEFINE WINDOW oWnd 
   ACTIVATE WINDOW oWnd MAXIMIZED; 
      ON PAINT Paint_Window(oDlg,@lInit) ; 
      ON INIT  Init_Window(oSay,@cSay,oDlg) 

RETURN (NIL) 

STAT FUNC Init_Window(oSay,cSay,oDlg) 
   cSay:="Init process, wait..." 
   oSay:Refresh() 
   WaitSeconds(3) 
   cSay:="Ready!" 
   oSay:Refresh() 
   MsgBeep() 
   WaitSeconds(1) 
   oDlg:End() 
RETURN (NIL) 

STAT FUNC Paint_Window(oDlg,lInit) 
   IF lInit 
      oDlg:SetFocus() 
      SysRefresh() 
      CursorWait() 
      lInit:=.F. 
   ENDIF 
RETURN (NIL) 

Posted: Thu Aug 21, 2008 12:39 pm
by TecniSoftware
Gracias Alfredo, lo voy a probar.

Saludos!