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
Problema grave de velocidad
- Antonio Linares
- Site Admin
- Posts: 37481
- Joined: Thu Oct 06, 2005 5:47 pm
- Location: Spain
- Contact:
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
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
- Antonio Linares
- Site Admin
- Posts: 37481
- Joined: Thu Oct 06, 2005 5:47 pm
- Location: Spain
- Contact:
- Antonio Linares
- Site Admin
- Posts: 37481
- Joined: Thu Oct 06, 2005 5:47 pm
- Location: Spain
- Contact:
- luis.santeliz
- Posts: 47
- Joined: Mon May 29, 2006 9:04 pm
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
Móvil SoftWare, C.A.
---------------------------------------------
MySQL DBA,
MySQL Server Performance Tunning,
DPxBase, FiveWin, Java,
Linux Redhat, Windows
Caracas Venezuela
luissanteliz@cantv.net
- luis.santeliz
- Posts: 47
- Joined: Mon May 29, 2006 9:04 pm
ah una cosa mas...
el codigo completo esta en www.alvajos.com/pruebita.zip
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
Móvil SoftWare, C.A.
---------------------------------------------
MySQL DBA,
MySQL Server Performance Tunning,
DPxBase, FiveWin, Java,
Linux Redhat, Windows
Caracas Venezuela
luissanteliz@cantv.net
- Antonio Linares
- Site Admin
- Posts: 37481
- Joined: Thu Oct 06, 2005 5:47 pm
- Location: Spain
- Contact:
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.
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.