Lentitud en la carga de Formularios

1,917 views
Skip to first unread message

Ricardo Pina

unread,
Dec 9, 2011, 7:45:19 AM12/9/11
to Grupo VFP
Hola Gente
 
Conocen alguna manera de acelerar la carga de los formularios, en mi caso tengo varios formularios con pageframes y cargados de grillas, combobox y listbox enlazados a cursores y estan tardando alrededor de 20 segundos y generan quejas dentro de mis queridos usuarios.
Alguna manera de hacer algún preload o distribuir la carga entre las páginas del formulario de manera que se muestre y puedan cargar datos en la primer página mientras sigue la carga del resto de las páginas
O directamente como optimizar los pasos de carga del formulario
 
Gracias de antemano por sus comentarios, voy a introducirme en el mundo google a ver si encuentro algo al respecto y publico
 
Saludos 

--
            

                   Ricardo Pina

Desarrollo y Servicios Informáticos

                  Profesionales
               www.dsip.com.ar

 

 


extremo

unread,
Dec 9, 2011, 7:52:12 AM12/9/11
to Comunidad de Visual Foxpro en Español
que Base de datos usas?... cuanto pesan tus tablas?.... haces algun
sql para mostrarsolo la inormacion que necesitas o traes toda la
informacion?

En el Load e Init traes informacion o cursores vacios?

Bandiciones

On 9 dic, 09:45, Ricardo Pina <ricp...@gmail.com> wrote:
> Hola Gente
>
> Conocen alguna manera de acelerar la carga de los formularios, en mi caso
> tengo varios formularios con pageframes y cargados de grillas, combobox y
> listbox enlazados a cursores y estan tardando alrededor de 20 segundos y
> generan quejas dentro de mis queridos usuarios.
> Alguna manera de hacer algún preload o distribuir la carga entre las
> páginas del formulario de manera que se muestre y puedan cargar datos en la
> primer página mientras sigue la carga del resto de las páginas
> O directamente como optimizar los pasos de carga del formulario
>
> Gracias de antemano por sus comentarios, voy a introducirme en el mundo
> google a ver si encuentro algo al respecto y publico
>
> Saludos
>
> --

> * *
>
> *                   Ricardo Pina*
>
> *Desarrollo y Servicios Informáticos*
>
> *                  Profesionales
>                www.dsip.com.ar*
>
> **

Carlos Miguel FARIAS

unread,
Dec 9, 2011, 8:12:21 AM12/9/11
to publice...@googlegroups.com
Para alijerar la carga de formularios con varios pageframes, tenes que aplicar la misma tecnica que se utiliza para cargar páginas web pesadas, o sea, distribuir la carga en partes.
O sea, si tienes un formulario con un pageframes con 10 page, al diseñarlo, hacelo normalmente, una vez que lo tienes funcionando, guarda los contenidos de cada page como una clase, (salvo el primer page) y borralos de cada page original (te quedarian 9 page "vacios").
Para guardarlo te conviene meter todo de algún contenedor.
En el evento activate de cada page, chequeas si dentro del page existe el objeto (clase) que tiene todos sus componentes (el contenedor indicado), de no ser asi, instancias dentro del page dicho objeto, y efectuas la activación (conexion a bd, carga iniciales, relaciones entre campos y bd, etc.).
De esa manera, cuando se carga el formulario, el contenido de cada page se carga la primera vez que se activa dicho page, por lo que el tiempo de activación (tus 20 segundos), se distribuyen a lo largo de la activación de cada page, es mas, si algun page no se activa, no se carga el mismo, y la demora es aun menor.
Como premio, adicionalmente, vas a tener que cada contenedor (de contenidos) del page, lo podras reutilizar en otros formularios (directamente o dentro de otros pageframes).
Saludos: Miguel

Ricardo Pina

unread,
Dec 9, 2011, 8:17:51 AM12/9/11
to publice...@googlegroups.com
Hola Extremo
 
Te cuento
Son tablas nativas
En el Init abro las tablas y genero los cursores de apoyo clientes , proveedores , productos , conceptos y demás ( Select sql) que enlazo a listbox o combobox que pueden estar a su vez en columnas de grillas
Los cursores no llegan a 5mil registros los mas grandes y los cursores de movimientos los genero vacios o no los genero en la carga inicial
 
Saludos

El 9 de diciembre de 2011 09:52, extremo <protech...@gmail.com> escribió:

extremo

unread,
Dec 9, 2011, 8:24:44 AM12/9/11
to Comunidad de Visual Foxpro en Español
mmmmm

Yo hago lo mismo (y creo que es lo correcto) y nunca un formulario se
me ha demorado mas 2 segundos en abrir aun con formularios repletos de
combobox y grillas..... haz chequeado si hay algun tipo de lentitud en
la red?.... Recuerdo hace un tempo atras que tenia un formulario que
de un dia para otro comenzo a demorar al abrir..... Despues de varias
pruebas descubri que habia un indice corrupto en esa tabla.....
tambien seria bueno que chequearas la integridad de tus tablas.... en
mi caso me ocurrio con SQLServer.

Espero que te pueda servir mi comentario, mientras tanto estare
pensando en otra cosa.
Bendiciones

On 9 dic, 10:17, Ricardo Pina <ricp...@gmail.com> wrote:
> Hola Extremo
>
> Te cuento
> Son tablas nativas
> En el Init abro las tablas y genero los cursores de apoyo clientes ,
> proveedores , productos , conceptos y demás ( Select sql) que enlazo a
> listbox o combobox que pueden estar a su vez en columnas de grillas
> Los cursores no llegan a 5mil registros los mas grandes y los cursores de
> movimientos los genero vacios o no los genero en la carga inicial
>
> Saludos
>

> **- Ocultar texto de la cita -
>
> - Mostrar texto de la cita -

Ricardo Pina

unread,
Dec 9, 2011, 8:24:47 AM12/9/11
to publice...@googlegroups.com
Hola Carlos
 
Muy buena esa.
En algo parecido estaba pensando pero como  nunca lo hice no sabia si iba en buen camino o era muy tirado de los pelos y me iba a empantanar más y que otras alternativas podria tener.
 
Saludos

Ricardo Pina

unread,
Dec 9, 2011, 9:07:49 AM12/9/11
to publice...@googlegroups.com
Sip
 
Las redes casi nunca son las mejores, pero evito echarle la culpa a las malas configuraciones ya que entras en discuciones con acusaciones mutuas con los técnicos y el cliente no sabe en quien creer.
Te cuento dos casos
1.- Tenia un cliente con varios equipos en red trabajando sobre un sistema y en un equipo en particular habia una falla que ya no recuerdo y comenzamos con las acusaciones cruzadas (equipo / sistema ) durante días y el cliente quejandose del tema. para mi era muy obvio, mismo sistema en 10 equipos 9 normal y uno con dificultades, no hay mucho que pensar,Opte por llevar yo un equipo y solucionar el problema
2.- En otro cliente un informe muy complejo llegaba a tardar en un equipo alrededor de 4 minutos ( tiempo suficiente para que hagan un repaso por toda tu familia), nuevamente acusaciones cruzadas, ahi tambien reunion cliente, técnico y yo, emito el informe desde ese equipo (persona encargada de esa tarea) y tarda los 4 minutos aprox acompañado de las qujas habituales, me voy a otro equipo en un escritorio vecino y el mismo informe tardo 8 segundos , entonces me miran sorprendidos y les digo "si, tenes razón, voy a revisar el código 8 segundos es una barbaridad" y me fui.
 
En este caso ahora asumo la lentitud del formulario ya que otros menos pesados tardan un tiempo razonable, igual la red es un "moustrito", son 3 pcs conectadas a un disco externo NAS que oficia como servidor de datos , pero quiero darle el gusto por una cuestión de proyección de ventas del sistema.
 
Saludos

Carlos Miguel FARIAS

unread,
Dec 9, 2011, 9:38:58 AM12/9/11
to publice...@googlegroups.com
La distribución que te propuse, achica tu codigo general de exe, lo hace además mas aprovechable (re) y se divides la conexion o relación de campos-bd, o demoras la creación de cursores hasta que los necesitas realmente, es mucho mas efectivo.
Si usas tablas nativas, no descartes que el disco donde se almacenan se fragmente (las tablas fragmentadas son mucho mas lentas).
Si usas tablas de trabajo temporal locales, puede pasar que o se acumulan porque "misteriosamente" no se borran (son tablas con extension tmp y nombres compuesto de numeros) y esto causa fragmentación del disco local y perdida de perfomance en el cliente. En todos los casos, una limpieza de archivos basura es altamente recomendable con sus correspondientes defragmentaciones.
En cuanto a los problemas de red, desde Windows NT hay herramientas del S.O. que permiten controlar como esta funcionando la red en cada máquina. Y la máquina lenta, puede tener elementos ajenos al aplicativo que la frenan, como pueden ser virus, disco sobrecargado (no tiene lugar para paginar) o fragmentado o algún banco de memoria con problemas, o el cable de la red estropeado. Cuando se jodia un cable coaxil de las redes, afectaba a todas las máquinas, porque el cable era unico. con los hubs, al fallar un cable (del hub a la maquina) afecta más esa maquina.

Samuel SMH

unread,
Dec 9, 2011, 10:33:19 AM12/9/11
to publice...@googlegroups.com
Ricardo, una vez me sucedio algo parecido en un sistema de Planillas, donde cargaba muchos combos y list y options.
la demora era casi parecida a tu tiempo.
El programador habia llenado los combos con SQL en la propiedad, osea
Rowsource = SQLExec(nHand, 'Select campo1, campo2 from Tablassmh where campoid = ?empresa' ,'Cur_SSMH')
que es parecido o igual al hacer esto en el INIT DEL FORMULARIO:
SQLExec(nHand, 'Select campo1, campo2 from Tablassmh where campoid = ?empresa' ,'Cur_SSMH')
Rowsource = 'Cur_SSMH'

Al hacer esto es que al momento de cargar antes del INIT del formulario, por cada combo estas conectandote y desconectandote, porcada combo viaja conecta y trae el cursor.

- Procedí a revisar las tablas e indices, y todo estaba OK, trabajaba con SQL SERVER 2005.
- al final la solucion fue cambiar la forma como cargas los combos o list; yo lo que hago desde entonces es:
en el Init del FORMULARIO, una sola vez me conecto a mi b.d. consumo un Store en la cual tengo un varios SELECTS con UNION ALL de todas las tablas y campos que necesito para llenar  los combos (por lo general son 2 a 4 campos,, mas no).

- UNA VEZ TRAIDO la información disparó un método llamado Cargar_combos()
en el cual mediante un SCAN FOR segun la tabla y combo que deseo llenar comienzo a filtrar y llenarlos.

De esta forma hasta ahora no tengo problemas de lentitud, y eso que yo trabajo con Formulario y Pagrframes (hasta 3 y cad uno con 3 a 5 páginas con un estimado de 10 combos por página); quizas no son muchos pero no veo la lentitud.

Saludos.






Ricardo Pina

unread,
Dec 9, 2011, 10:54:09 AM12/9/11
to publice...@googlegroups.com
Hola Samuel
 
Creo que este debe ser mi caso también, Carlos Farías fué más drástico y más óptimo, claseando directamente las páginas, tu alternativa también es muy buena, se me ocurre poner los pages vacios o con los controles vacios y llenarlos por demanda en el activate de cada una de ellas.
 
if thisform.pageframe.paginaX.propiedadqueindicaempty
  thisform.llenacontrolesdepagina(paginaX)
  this.propiedadqueindicaempty = .F.
endif
¿ Estoy en lo correcto ?
 
Saludos 

extremo

unread,
Dec 9, 2011, 10:59:23 AM12/9/11
to Comunidad de Visual Foxpro en Español
Ricardo

La solucion de llenar la data en el activate en lo personal no me
gusta mucho, yo tengo una aplicacion que funciona asi, y hacerle
mantencion a ese form es todo un parto. Mi opinion es que tomes esa
alternativa como ultima solucion.

La solucion que da Samuel es mas rapida de implementar. yo nunca la he
usado asi pero si Samuel dice que de esa forma se mejora el
performance, entonces es cosa de hacer pruebas.

Bendiciones


On 9 dic, 12:54, Ricardo Pina <ricp...@gmail.com> wrote:
> Hola Samuel
>
> Creo que este debe ser mi caso también, Carlos Farías fué más drástico y
> más óptimo, claseando directamente las páginas, tu alternativa también es
> muy buena, se me ocurre poner los pages vacios o con los controles vacios y
> llenarlos por demanda en el activate de cada una de ellas.
>
> if thisform.pageframe.paginaX.propiedadqueindicaempty
>   thisform.llenacontrolesdepagina(paginaX)
>   this.propiedadqueindicaempty = .F.
> endif
> ¿ Estoy en lo correcto ?
>
> Saludos
>

Walter R. Ojeda Valiente

unread,
Dec 9, 2011, 11:06:37 AM12/9/11
to publice...@googlegroups.com
Hola Ricardo

Quizás sean solamente una o dos las Pages que están cargándose muy lentamente. Lo que podrías hacer es quitarlas a todas y dejar solamente una y verificar la velocidad de carga.
Si aumentó mucho la velocidad entonces ya sabes que el problema está en las pages.
Luego pones dos pages y verificas la velocidad.
Luego pones tres pages y verificas la velocidad.
Y así sucesivamente, hasta encontrar a la o las culpable/s

Saludos.

Walter.




From: ric...@gmail.com
Date: Fri, 9 Dec 2011 10:24:47 -0300
Subject: Re: [vfp] Re: Lentitud en la carga de Formularios
To: publice...@googlegroups.com

Ricardo Pina

unread,
Dec 9, 2011, 11:10:07 AM12/9/11
to publice...@googlegroups.com
Hola
 
Encontre esto en MSDN
Es más o menos lo que me decia Carlos Farías con algunos otros tips complementarios
pongo a dispoción
 
 

 

Usar el entorno de datos

Si utiliza el entorno de datos del Diseñador de formularios o el Diseñador de informes, el rendimiento de la apertura de la tabla es mucho más rápido que si se ejecutan los comandos USE, SET ORDER y SET RELATION en el evento Load del formulario. Cuando use el entorno de datos, Visual FoxPro utiliza las llamadas al motor de nivel inferior para abrir las tablas y configurar los índices y las relaciones.

Limitar el número de formularios en un conjunto de formularios

Utilice conjuntos de formularios solamente cuando necesite que un grupo de formularios comparta una sesión privada de datos. Cuando utilice un conjunto de formularios, Visual FoxPro crea instancias de todos los formularios y de todos los controles de todos los formularios del conjunto, aun cuando sólo se muestre en pantalla el primer formulario del conjunto. Esto puede resultar lento e innecesario si los formularios no tienen que compartir una sesión privada de datos. En su lugar, debería ejecutar DO FORM para los otros formularios cuando sean necesarios.

Sin embargo, si utiliza un conjunto de formularios, obtendrá una pequeña mejora del rendimiento cuando tenga acceso a los formularios del conjunto, porque los formularios ya estarán cargados aunque no serán visibles.

Carga dinámica de controles de página en un marco de página

Los marcos de página, al igual que los conjuntos de formularios, cargan todos los controles de cada página en el momento de cargar el marco de página lo que da lugar a una demora perceptible cuando se carga este último. En su lugar, podría cargar los controles de página dinámicamente a medida que se fueran necesitando, creando una clase fuera de los controles de cada página y cargándolos cuando se activara la página.

Para cargar dinámicamente los controles de página

  1. Diseñe el formulario de la forma habitual, incluyendo todos los controles en todas las páginas.
  2. Una vez terminado el diseño, vaya a la segunda página del marco de página y guarde los controles allí existentes como una clase.
  3. Abra la clase que acaba de crear y compruebe que los controles sigan dispuestos de la forma correcta.
  4. Repita los pasos 2 y 3 para la tercera página y las siguientes del marco de página.
  5. En el evento Activate de la segunda página y de las siguientes del marco de página, agregue objetos y déjelos visibles.

    Por ejemplo, si la clase de controles se llama cnrpage1, debe agregar el código siguiente:

    IF THIS.ControlCount = 0
       THIS.AddObject("cnrpage1","cnrpage1")
       THIS.cnrpage1.Visible = .T.
    ENDIF
    

Enlace dinámico de controles a datos

Puede reducir el tiempo de carga de un formulario que contenga un gran número de controles enlazados a datos si retrasa el enlace de esos controles hasta el momento en que sean necesarios.

Para enlazar dinámicamente controles a datos

  1. Sitúe las tablas y vistas del formulario en el entorno de datos de modo que se abran cuando se cargue el formulario.
  2. Para cada control dependiente, agregue código al código de evento GotFocus que enlaza el control al valor de los datos. Por ejemplo, el código siguiente enlaza un control ComboBox al campo customer.company:
    * Check to see if the control has been bound yet.
    IF THIS.RecordSource = ""
       * Set the record source to the right value
       * and set the record source type to "fields"
       THIS.RecordSource = "customer.company"
       THIS.RecordSourceType = 6
       THIS.Refresh
    ENDIF
    

Retardo de la actualización de pantalla

Si realiza varios cambios en la pantalla, por ejemplo, cambia los valores de varios controles a la vez, puede reducir el tiempo global necesario para actualizar la pantalla si retarda la actualización de pantalla hasta que se realicen todos los cambios. Por ejemplo, si hace que los controles queden visibles o invisibles, cambia los colores de los controles o mueve los registros de controles dependientes, resulta mucho más eficaz retardar el relleno de color de estos controles hasta que se hayan completado todos los cambios:

Para retardar la actualización de la pantalla

  1. Establezca la propiedad LockScreen del formulario en el valor verdadero.
  2. Actualice los controles cuando sea necesario.
  3. Llame al método Refresh del formulario.
  4. Establezca la propiedad LockScreen del formulario en el valor falso.

El ejemplo siguiente cambia varias propiedades de la pantalla a la vez, se desplaza a un registro nuevo y sólo entonces actualiza la pantalla con información nueva. Si LockScreen no se hubiera establecido como verdadero, en cada una de estas operaciones se volverían a dibujar los controles afectados individualmente y el rendimiento global de la actualización parecería retardado.

THISFORM.LockScreen = .T.
THISFORM.MyButton.Caption = "Save"
THISFORM.MyGrid.BackColor = RGB (255, 0, 0) && Red
SKIP IN customers
SKIP IN orders
THISFORM.Refresh
THISFORM.LockScreen = .F.
Sugerencia Esta técnica no proporciona ninguna ventaja si está actualizando un único control.

Reducir código en métodos usados con frecuencia

Puesto que el método Refresh y el evento Paint suelen utilizarse con frecuencia, puede aumentar el rendimiento de formularios si reduce la cantidad de código de estos métodos. De forma análoga, para reducir el tiempo de carga de un formulario, puede mover código desde el evento Init a los eventos usados con menos frecuencia como Activate, Click y GotFocus. Después, use una propiedad del control (como Tag o una propiedad personalizada) para hacer un seguimiento de si el control ya ha ejecutado el código que sólo necesita ejecutarse una vez.

Carlos Miguel FARIAS

unread,
Dec 9, 2011, 11:32:09 AM12/9/11
to publice...@googlegroups.com
Posiblemente en algún lugar habia leido ese articulo, o alguno relacionado, pero se me habia perdido en algún lugar ignoto de conjunto neuronal.

Guillermo Carrero

unread,
Dec 9, 2011, 11:55:38 AM12/9/11
to publice...@googlegroups.com
Hola Ricardo:

Prueba con SET TABLEVALIDATE TO 0
Lo puedes colocar en tu CONFIG.FPW así, TABLEVALIDATE = 0

Un saludo,

Guillermo Carrero
Barcelona - España

Ricardo Pina

unread,
Dec 10, 2011, 2:41:30 PM12/10/11
to publice...@googlegroups.com
Gracias
No tenia conocimiento de este Seteo, Lo voy a poner en práctica.
 
Saludos

Reply all
Reply to author
Forward
0 new messages