Page 2 of 2

Posted: Tue Sep 12, 2006 9:24 am
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

Posted: Tue Sep 12, 2006 11:42 am
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.

Posted: Tue Sep 12, 2006 4:22 pm
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

Posted: Tue Sep 12, 2006 4:31 pm
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.

Posted: Tue Sep 12, 2006 6:05 pm
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

Posted: Tue Sep 12, 2006 11:28 pm
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.

Posted: Wed Sep 13, 2006 10:28 pm
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]
/////////////////////////////
// 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 los campos 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 nPosCampo 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(nPosCampo)

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(nPosCampo,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 := "¤¥‚¡¢£

Posted: Wed Sep 13, 2006 10:32 pm
by luis.santeliz
ah una cosa mas...
el codigo completo esta en www.alvajos.com/pruebita.zip

Posted: Thu Sep 14, 2006 5:31 am
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.