Problema uso de Memoria

Problema uso de Memoria

Postby un_jeepero » Sat Sep 23, 2006 1:22 am

Hola amigos a ver si alguien me echa una manito...

Tengo una app que Carga un array con datos de ventas que digita el usuario y los muestra con la XTBrowse en un Dialog, luego los imprimo, guardo y lipio ese array. Una vez limpio el array paso a la siguiente venta en el mismo proceso, esto se realiza en un mismo Dialog.

El problema se produce cada vez que refresco el browse para hacer una nueva venta, alli aumenta el uso en memoria de la app llegando hasta un limite en que consume gran parte de la memoria del pc y el dialog comienza a desaparecer y la app hay que cerrarla con el administrador de tareas.

He realizado varias depuraciones y he bajado ese uso de memoria, pero ya no se que mas hacer, actualmente el problema se da cuando hago +- 100 ventas seguidas.... pero al usuario ya le molesta estar cerrando y habriendo la app cada vez que ocurre...

por favor alguien echeme una manito

de ante mano,
muchas gracias..

Esta es la estructura general de la app.

#include "FIVEWIN.CH"
#include "DTPICKER.CH"

#define AR_DATOS ::aDatos //defino el array

***defino las variables a ocupar en el array
#define BA_nAt ::oBrw:nArrayAt
#define BA_NUMBOL 01
#define BA_DESPRO 02
#define BA_SUBTOT 03
......
.....
/*-----------------------------------------------------------------------------------------------*/
CLASS FT604
DATA oBrw, oBtn, oCat, oDlg
DATA aDbf
METHOD Open()
METHOD Init()
METHOD New() Constructor
METHOD Close() INLINE AEval( ::aDbf, { |oDbf| oDbf:Close() } ), .T.
METHOD Agrega()
...
...
ENDCLASS
/*-----------------------------------------------------------------------------------------------*/
METHOD Open() CLASS FT604 //abro las dbf's
::aDbf := Array( 02 )
DB_PRODUC := Tred():Use( GetApp():cRuta + "COPRODUC.DBF" )
DB_CAJAS := TRed():Use( GetApp():cRuta + "MOCAJERO.DBF" )
RETURN lTredOpen( ::aDbf )

/*-----------------------------------------------------------------------------------------------*/
METHOD Init() CLASS FT604 //preparo el array , y declaro variables
AAdd( AR_DATOS, ::AddReg() )
::oGet := Array( 7 )
::vGet := Array( 7 )
.....
RETURN .T.
/*-----------------------------------------------------------------------------------------------*/
METHOD AddReg() CLASS FT604
RETURN { Space( 01 ) ,; // 01 - NUMBOL 01
Space( 01 ) ,; // 02 - DESPRO 02
0 ,; // 03 - CODPRO 03
.F. } // 09 - ..... ESTADO 09
/*-----------------------------------------------------------------------------------------------*/
METHOD New() CLASS FT604
LOCAL vMsg, oMsg
DEFINE Dialog ::oDlg Resource "DL_604_VTAPOS"
Redefine DTPICKER ::oDpk VAR ::vDpk Id 106 Of ::oDlg COLORS CLR_BLACK ,CLR_RED
Redefine Get ::oGet[01] VAR ::vGet[01] id 131 of ::oDlg Update valid { || ::Agrega() } COLORS CLR_BLACK ,CLR_HCYAN
::oGet[07]:bGotFocus := { || ::oGet[07]:SetFocus() }
....

REDEFINE BTNBMP ::oBtn[05] ID 139 OF ::oDlg ;
RESOURCE "SALIR2" Tooltip "Salir Modulo Ventas..."
::oBtn[05]:bAction := { || ( ::oDlg:bValid := { || .T. } ) }
....

WITH OBJECT ( ::oBrw := TXBrowse():New( ::oDlg ) )
::SetBrw()
:CreateFromResource(107)
END
::oDlg:bKeyDown := { |nKey| ::Tecla( nKey ) }
Activate Dialog ::oDlg center Valid .F.
::Close()
RETURN Self
/*-----------------------------------------------------------------------------------------------*/
METHOD Agrega() CLASS FT604 //agrega los datos al array
hb_gcAll()
AR_DATOS[BA_nAt][BA_NUMBOL] := ::vGet[01]
AR_DATOS[BA_nAt][BA_DESPRO] := ::vGet[02]
AR_DATOS[BA_nAt][BA_SUBTOT] := ::vGet[03]
.....
::Totales()
RETURN NIL
/*-----------------------------------------------------------------------------------------------*/
METHOD Totales() CLASS FT604 //sumo los parciales y refresco
::vSay[01] := 0
::vSay[04] ++
AEval( AR_DATOS, { |aDat| ::vSay[01] += aDat[03] } )
::oSay[01]:Refresh()
RETURN .T.
/*-----------------------------------------------------------------------------------------------*/
METHOD SetBrw() CLASS FT604 //refresca los datos agregados al array
WITH OBJECT ::oBrw
:SetArray( AR_DATOS )
:aCols[ BA_NUMBOL ]:Hide()

WITH OBJECT :aCols[ BA_DESPRO ]
:cHeader := "DETALLE DEL PRODUCTO"
:nWidth := 350
:oDataFont := ::oFont2
END
WITH OBJECT :aCols[ BA_SUBTOT ]
:cHeader := "SUB - TOTAL "
:nWidth := 100
:oDataFont := ::oFont2
END
END
RETURN NIL
/*-----------------------------------------------------------------------------------------------*/
METHOD Tecla( nKey ) CLASS FT604 //teclas que se presionan para el cambio
DO CASE
CASE nKey == VK_F2 .AND. ::vSay[01] > 0 ; ::cambio()
ENDCASE
RETURN NIL
*------------------------------------------------------------------------------------------------*/
METHOD Cambio() CLASS FT604
LOCAL oDlg, oBtn, vSay, oSay, vPag, oPag, oRbt, vRbt, oGet, vGet, vCkb, oCkb
DEFINE Dialog oDlg Resource "DL_EFEC_POS"
Redefine Get oPag VAR vPag id 105 of oDlg valid { || ::vuelto( vPag, oBtn ) } Font ::oFont COLORS CLR_BLACK ,CLR_HCYAN
Redefine Button oBtn[01] Id 106 Of oDlg Action (::oDlg:bValid := {||.T.}, ::Imprimir(), ::Guardar(), oDlg:END() )
ACTIVATE DIALOG oDlg Center
RETURN .T.
*------------------------------------------------------------------------------------------------*/
METHOD Vuelto( vPag, vSay, oBtn, oSay ) CLASS FT604
vSay[03] := Transform( vPag - vSay[02], "999,999,999" )
IF Val( vSay[03] ) < 0
MsgInfo( "Monto Pagado es incorrecto....!!","Atención Cajeros..." )
vPag := 0
oBtn[01]:Disable()
ELSE
oBtn[01]:Enable()
ENDIF
oSay[03]:Refresh()
RETURN .T.
/*-----------------------------------------------------------------------------------------------*/
METHOD Imprimir() CLASS FT604 //se imprime el comprobante de pago
Local cPuerto:="LPT1", oPrn
LOCAL nLin, nFor
oPrn:=TDosPrn():New(cPuerto)
oPrn:Command("27,112,0,60,240")
oPrn:SayCmp( 01,00, "Caja:" )
FOR nFor = 1 TO Len( AR_DATOS )
imprimo los datos del array
.....
NEXT
oPrn:end(.T.)
MsgInfo( "Documento Generado", "Atención Usuario..." )
RETURN .T.

/*-----------------------------------------------------------------------------------------------*/
METHOD Guardar() CLASS FT604 //guardo los datos en la dbf y vuelve con otra transaccion
LOCAL nFor
FOR nFor = 1 TO Len( AR_DATOS )
paso el array a la dbf...
.....
NEXT
::oSay[03]:Refresh()

hb_gcAll()
AR_DATOS := {}
AAdd( AR_DATOS, ::AddReg() )
SysRefresh()
::SetBrw() /// AQUI SE PRODUCE EL AUMENTO EN EL USO DE LA MEMORIA, cuando paso a la siguiente transacción
RETURN Self
un_jeepero
 
Posts: 31
Joined: Fri Mar 17, 2006 2:04 pm

Postby Antonio Linares » Sat Sep 23, 2006 6:09 am

Llama a hb_gcAll() para que harbour haga una recogida de "basura".

FWH la llama automáticamente al salir de un diálogo, pero si no sales del diálogo, entonces no se está recogiendo la memoria que ya no está en uso.
regards, saludos

Antonio Linares
www.fivetechsoft.com
User avatar
Antonio Linares
Site Admin
 
Posts: 41901
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain

Hola Antonio, gracias por la ayuda

Postby un_jeepero » Mon Sep 25, 2006 1:34 pm

Antonio Linares wrote:Llama a hb_gcAll() para que harbour haga una recogida de "basura".

FWH la llama automáticamente al salir de un diálogo, pero si no sales del diálogo, entonces no se está recogiendo la memoria que ya no está en uso.


sabes hago la llamada a hb_gcall() cuando cargo el array y luego antes de pasar a la siguiente transacción.

salu2
un_jeepero
 
Posts: 31
Joined: Fri Mar 17, 2006 2:04 pm


Return to FiveWin para Harbour/xHarbour

Who is online

Users browsing this forum: No registered users and 103 guests