Problema grave de velocidad

jmartial
Posts: 457
Joined: Tue Mar 14, 2006 7:26 pm

Post by jmartial »

Antonio,

Ya está probado y el resultado es el mismo.

Con entar una vez en el diálogo da estos valores:

Entra Mem usada: 53% T.Física libre: 14872.00 kb
Sale Mem usada: 54% T.Física libre: 14348.00 kb

Y si entramos 5 veces:

Sale Mem usada: 58% T.Física libre: 13380.00 kb


Como ves la pérdida de memoria en 5 veces que entre es 1492 Kb

Luego trabajando va recuperando algo, pero al final se queda sin memoria.

¿Que puedo mirar para ver que recursos se quedan en memoria ?



Un Saludo,
Joaquín
User avatar
Antonio Linares
Site Admin
Posts: 37481
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain
Contact:

Post by Antonio Linares »

Joaquín,

Prueba a hacer un diálogo sin ningún control en él y entra y sal y comprueba la memoria. Luego ve añadiéndole más controles tuyos, hasta que encontremos lo que pueda estar ocurriéndole.

hb_gcAll() debe restaurar la memoria al valor anterior de llamar al diálogo.
regards, saludos

Antonio Linares
www.fivetechsoft.com
jmartial
Posts: 457
Joined: Tue Mar 14, 2006 7:26 pm

Post by jmartial »

Antonio,

Un Diálogo con controles fwppc, 1 combo, 1 checkbox, 1 browse , 2 Botones, 1 TBtnBmp

Y pierde bastante al entrar y luego sólo recupera algo, aunque luego puedes volver a entrar y salir y algunas veces baja unos bytes.

Pero, lo que no entiendo es como trabaja windows con la memoria, si tiene memoria disponible bastante empieza a usarla sin recuperar nada y de vez en cuando parece que recupera lo que le parece.

¿Es algo parecido a esto? Porque si es así, puede que la función del api globalmemory no sea totalmente real en el instante.


Un Saludo,
Joaquín
User avatar
Antonio Linares
Site Admin
Posts: 37481
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain
Contact:

Post by Antonio Linares »

Joaquín,

Puede ser así, como dices, similar a como funciona Clipper. Usa memoria virtual y no la libera, hasta que cada cierto tiempo hace limpieza y la recupera.
regards, saludos

Antonio Linares
www.fivetechsoft.com
jmartial
Posts: 457
Joined: Tue Mar 14, 2006 7:26 pm

Post by jmartial »

Antonio,

He seguido con las pruebas , entrando y saliendo en diálogos y llega al 100% de memoria gastada física, se pone lentísima y hasta se termina colgando cuando se le acaba la memoria virtual.



Un Saludo,
Joaquín
User avatar
Antonio Linares
Site Admin
Posts: 37481
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain
Contact:

Post by Antonio Linares »

Joaquín,

Si comentas los REDEFINEs de los controles en el diálogo y dejas solo el diálogo no hay pérdida alguna de memoria. Luego quiere decir que algún control está gastando algo de memoria. Estamos revisándolo.
regards, saludos

Antonio Linares
www.fivetechsoft.com
User avatar
luis.santeliz
Posts: 47
Joined: Mon May 29, 2006 9:04 pm

Post by luis.santeliz »

que tal amigos, q tal don antonio.. he seguido el hilo y a mi tambien me paso algo parecido, cuando queria matar un control para pasar a otro dialogo, o simplemente para poner otro en lugar del anterior, la aplicacion se ponia algo lenta.. luego me di cuenta q el arreglo aControls crecia sin parar cada vez que hacia una nueva llamada, esto lo pude subsanar, llamando al metodo Hide() en vez de End() y condicionando la ejecucion, si necesitaba llamar de nuevo a un control determinado, preguntaba si ya existia y le hacia un Show(), aparte de eso no asigno variables a los controles, por ejemplo

Code: Select all

/////////////////////////////
// PRUEBA PARA FORO FWPPC
// Luis Santeliz - 12/06/2006
// luissanteliz@cantv.net
//

#include "fwce.ch"
#include "colors.ch"
#include "winapi.ch"

FUNCTION Main()
LOCAL aPict, aCampos

PUBLIC _oWnd, oContenedor, oFnt

#DEFINE data     curdir()+"\data"
#DEFINE bitmaps  curdir()+"\bitmaps"

DEFINE FONT oFnt NAME "Arial" SIZE 0,12
DEFINE FONT oFnt2 NAME "Arial" SIZE 0,12 BOLD

DEFINE WINDOW _oWND TITLE "Prueba Foro FWPPC"

USE (data+"\clientes.dbf") ALIAS "CLI" INDEX (data+"\clientes") NEW

DEFINE DIALOG oContenedor OF _oWND STYLE nor(WS_CHILD, WS_BORDER) ;
      FROM 296, 2 TO 317, 200 PIXEL

ACTIVATE DIALOG oContenedor NOWAIT


#DEFINE oBrw _oWnd:aControls[1]

aPicture:={NIL,"999.99"}
aCampos:={"CLI_NOMBRE","CLI_DESCUE"}

@ 1,1 LISTBOX FIELDS (ContenedorSay(CLI->CLI_CODIGO), OemToAnsi(LEFT(CLI->CLI_NOMBRE,30))), TRANSFORM(CLI->CLI_DESCUE,aPicture[2]) ALIAS "CLI" ;
      HEAD "Nombre","Desc" SIZE 240,200 PIXEL OF _oWnd ;
      ON CLICK (EditCelda(oBrw,aPicture,aCampos))  ;
      FONT oFnt

oBrw:lCellStyle:=.t.      // por celda
oBrw:aJustify:={.f.,.t.}  // Justifica el texto a la derecha o ala izquierda de cada campo


 ACTIVATE WINDOW _oWND
RETURN (.T.)

////////////////////////
// Editar celda
//    oxBrw   : objeto TWBrowse
//    aPict   : arreglo con el PICTURE del get, si es NIL no hara el get, si es un codeblock se evaluara, pero aceptara solo valores caracter o NIL
//    aCampos : arreglo con los nombres de _ del alias del browse
//


FUNCTION EditCelda(oxBrw,aPict,aCampos)

   #DEFINE nColActual oxBrw:nColAct
   #DEFINE nLargo oxBrw:aColSizes[nColActual]
   #DEFINE cPict IIF( ValType(aPict[nColActual])="B", Eval(aPict[nColActual]) , aPict[nColActual] )
   #DEFINE cSay rtrim(oxBrw:aHeaders[nColActual])
   #DEFINE _ FieldPos(aCampos[nColActual])
   #DEFINE nAncho 15

   LOCAL uVar:=NIL

   // #DEFINE oCantidad           oFld:aDialogs[2]
   #DEFINE oContenedorSay        oContenedor:aControls[1]
   #DEFINE oContenedorGet        oContenedor:aControls[2]
   #DEFINE oContenedorBtnBmp1    oContenedor:aControls[3]
   #DEFINE oContenedorBtnBmp2    oContenedor:aControls[4]

   IF cPict=NIL
      ContenedorSay("No se puede editar.")
      RETURN NIL
   ENDIF
   uVar:=FieldGet(_)

   oContenedor:EraseBkGnd( oContenedor:GetDC() )
   oContenedor:ReleaseDC()
//
// AQUI ES DONDE HAGO LA LLAMADA AL PROCEDIMIENTO Show()
//


   IF Len(oContenedor:aControls)>2
      oContenedorGet:cText(uVar)
      oContenedorGet:Refresh()
      oContenedorGet:SetFocus()
     // AEval(oContenedor:aControls,{|a,i| a:Show()},3)
      oContenedorGet:Show()
      oContenedorSay:Show()
      oContenedorBtnBmp1:Show()
      oContenedorBtnBmp2:Show()
      RETURN uVar
   ENDIF

  //
  // Panel para la presentacion del get que obtiene la cantidad luego de seleccionar el articulo para el documento
  //

   @ 1, 0 SAY cSay+":" SIZE (len(cSay)*6)+1, nAncho PIXEL FONT oFNT2 DIALOG oContenedor

   @ oContenedorSay:nTop, oContenedorSay:nRight+1 GET uVar SIZE (len(cPict)*6), nAncho PIXEL PICTURE cPict FONT oFnt RIGHT DIALOG oContenedor

   @ oContenedorSay:nTop-2,oContenedorGet:nRight+2 BTNBMP FILE bitmaps+"\si16x16.bmp", bitmaps+"\si16x16_.bmp" ;
      SIZE 18,18  PIXEL ACTION (oxBrw:cAlias)->(FieldPut(_,uVar)),oContenedorBtnBmp2:Hide(),oContenedorBtnBmp1:Hide() DIALOG oContenedor

   @ oContenedorSay:nTop-2,oContenedorBtnBmp1:nRight+1 BTNBMP FILE bitmaps+"\no16x16.bmp", bitmaps+"\no16x16_.bmp" ;
      SIZE 18,18 PIXEL ACTION oContenedorBtnBmp1:Hide(),oContenedorBtnBmp2:Hide() DIALOG oContenedor

   oContenedorGet:bGotFocus :={||ShowKeyboard() }
   oContenedorGet:bLostFocus:={||HideKeyboard(),oContenedorSay:Hide(),oContenedorGet:Hide(), oxBrw:Refresh() }
   oContenedorGet:SetFocus()


   // EraseBkGnd( hDC )
RETURN

/////////////////////////
// Pinta un mensaje en el contenedor, (y literalmente pinta)
//

FUNCTION ContenedorSay(cMsg)
      oContenedor:EraseBkGnd( oContenedor:GetDC() )
      oContenedor:ReleaseDC()
      oContenedor:Say(1,2,cMsg,CLR_BLACK,CLR_WHITE,oFnt,.T.)
RETURN .T.

/////////////////////////////////////
// convierte texto de msdos en ansi
//
function OemToAnsi( cText )

   local cOem  := "¤¥‚¡¢£
Luis Santeliz
Móvil SoftWare, C.A.
---------------------------------------------
MySQL DBA,
MySQL Server Performance Tunning,
DPxBase, FiveWin, Java,
Linux Redhat, Windows

Caracas Venezuela
luissanteliz@cantv.net
User avatar
luis.santeliz
Posts: 47
Joined: Mon May 29, 2006 9:04 pm

Post by luis.santeliz »

ah una cosa mas...
el codigo completo esta en www.alvajos.com/pruebita.zip
Luis Santeliz
Móvil SoftWare, C.A.
---------------------------------------------
MySQL DBA,
MySQL Server Performance Tunning,
DPxBase, FiveWin, Java,
Linux Redhat, Windows

Caracas Venezuela
luissanteliz@cantv.net
User avatar
Antonio Linares
Site Admin
Posts: 37481
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain
Contact:

Post by Antonio Linares »

Luis,

Estás usando un diálogo no modal, luego si no lo destruyes, cada vez que llamabas a EditCelda() crece aControls, es normal. Tienes que destruirlo con :End() y volver a crearlo de nuevo.

Tu sistema lo que hace es reutilizarlo :-)

El problema que describe Joaquín es diferente y ya está practicamente arreglado.
regards, saludos

Antonio Linares
www.fivetechsoft.com
Post Reply