Page 1 of 2
Fuga de recursos
Posted: Fri Nov 18, 2011 9:12 pm
by hmpaquito
Hola a todos,
Cuando el usuario lleva algo asi como cinco horas trabajando salta un error tal que:
Descripcion Error: Error BASE/1004 Class: 'SYMBOL' has no exported method: ADDCONTROL
Args:
[ 1] = U SYMBOL
[ 2] = U nil NIL
Me huele que la cosa es tema de recursos; que en mi aplicacion tengo que tener un puñado de "fugas" que multiplicado por no se cuantas horas de ejecucion/navegacion por el programa produce el error.
¿ No deberia arreglarse si en el metodo :End() de la clase TDialog pusiera
FOR i:= 1 to Len(::aControls)
::aControls[i]:End()
NEXT ?
Si ya se que puede haber objetos gdi como pen, brush y otros que pueden no estar ligados al dialogo... en fin...
Vosotros, ¿ por donde empezariais a buscar ? La cosa se me hace cada vez mas urgente.
¿ Hay alguna forma de saber que objetos son y donde, en el programa se crearon ?
Saludos
Re: Fuga de recursos
Posted: Fri Nov 18, 2011 10:38 pm
by lucasdebeltran
hola
prueba con checkres() y setresdebug
Re: Fuga de recursos
Posted: Fri Nov 18, 2011 10:55 pm
by hmpaquito
Lucas,
Es que no se bien cuando tengo que liberar los recursos;
Si yo tengo
DEFINE DIALOG oDlg
DEFINE IMAGE oImg;
OF oDlg
DEFINE FONT oFont
ACTIVATE DIALOG oDlg
Solo tengo que liberar el oFont ¿ no es asi ? Aunque viendo el codigo fwh no encuentro como libera el oImg...
A ti ¿ que te parece ?
Saludos
Re: Fuga de recursos
Posted: Fri Nov 18, 2011 11:30 pm
by lucasdebeltran
hola,
después del activate deberías poner ofont:end()
y aquí tienes un ejemplo con checkres
Code: Select all | Expand
// prueba
#include "FiveWin.ch"
static oWnd
//----------------------------------------------------------------------------//
function Main()
local oWndEdit, oBar, oIcon, oImage
local cName := "FiveWin power"
local oFont
SetResDebug(.t.)
DEFINE FONT oFont NAME "Arial" SIZE 10, 16
DEFINE ICON oIcon RESOURCE "test"
DEFINE WINDOW oWnd FROM 1, 1 TO 20, 70 TITLE "I am the MDI Frame" ;
MDI ;
MENU BuildMenu() ; // COLOR "GR+*/RB"
ICON oIcon
SET MESSAGE OF oWnd TO "Main Window"
DEFINE WINDOW oWndEdit MDICHILD OF oWnd FROM 2, 2 TO 20, 50 ;
TITLE "I am a MDI Child" COLOR "W+/R"
@ 4, 2 GET cName OF oWndEdit SIZE 170, 25 COLOR "BG+/B"
DEFINE BUTTONBAR oBar _3D OF oWndEdit
DEFINE BUTTON OF oBar
SET MESSAGE OF oWndEdit TO "Child Window"
ACTIVATE WINDOW oWndEdit
ACTIVATE WINDOW oWnd MAXIMIZED ;
VALID MsgYesNo( "Want to End ?" )
RELEASE FONT oFont
CHECKRES()
return nil
//----------------------------------------------------------------------------//
function BuildMenu()
local oMenu
MENU oMenu
MENUITEM "&Information"
MENU
MENUITEM "&About..." ACTION MsgAbout( "FiveWin", "FiveTech" )
SEPARATOR
MENUITEM "&End..." ACTION oWnd:End()
ENDMENU
MENUITEM "&Child Windows"
MENU
MENUITEM "&Tiled" ACTION oWnd:Tile()
MENUITEM "&Cascade" ACTION oWnd:Cascade()
ENDMENU
ENDMENU
return oMenu
//----------------------------------------------------------------------------//
Re: Fuga de recursos
Posted: Fri Nov 18, 2011 11:36 pm
by Daniel Garcia-Gil
Hola
Todos los controles hijos son liberados automaticamente...
una forma util de ver el consumo de recursos es por medio del Task Manager de windows
abre el task manager -> View -> Select Columns, selecciona Gdi Object
ahora puedes ver de forma dinamica el consumo de gdi,puedes redimencionar tus pantallas para provocar el repintado de los controles, tambien puedes entrar y salir de los modulos y detectar cuanto tenias antes y despues de salir
Re: Fuga de recursos
Posted: Sat Nov 19, 2011 2:05 am
by hmpaquito
Lucas y Daniel,
Gracias por vuestra ayuda; utilizando la funcion checres(), que me comento lucas, y otra que he encontrado en el foro: GetGdiObjects() he disminuido bastante el uso de recursos. Daniel: todo los que encuentro en el archivo resxxx.txt son bitmap, brush y font... claro... entonces fwh, como bien dices tu, libera los recursos "hijo" de nuestros dialogos.
Bueno... ya tengo la cosa en buen camino. De nuevo, muchas gracias a los dos.
Saludos
Re: Fuga de recursos
Posted: Sat Nov 19, 2011 10:36 am
by Antonio Linares
hmpaquito,
Que versión de Harbour ó xHarbour estás usando ?
Re: Fuga de recursos
Posted: Sat Nov 19, 2011 11:45 am
by hmpaquito
Antonio,
xHarbour 1.0.0 beta 1 (marycastaña's time)
Saludos
Re: Fuga de recursos
Posted: Sat Nov 19, 2011 5:53 pm
by Antonio Linares
Lo más aconsejable es que actualices tango xHarbour como FWH y casi seguro que esos problemas desaparecen

Re: Fuga de recursos
Posted: Sun Nov 20, 2011 5:22 pm
by hmpaquito
Antonio,
Gracias por el consejo. Debido a la dualidad enormidad del programa/ falta tiempo, me es, ahora mismo, muy difícil plantear actualizaciones, bien hrb, bin fwh. En cualquier caso, es algo que siempre tengo en mete.
Saludos
Re: Fuga de recursos
Posted: Mon Nov 21, 2011 8:53 am
by hmpaquito
Hola de nuevo,
Una ultima cuestion. El archivo que genera CheckRes(), me muestra una cantidad de recursos...., en cambio GetGdiObjects(), o el mismisimo visor de procesos de Windows, me muestra una cantidad MAYOR, siempre.
Acaso el CheckRes() no muestra todos los recursos... ¿ qué faltaría ? ¿ quizá los handles de archivo ? Pero los handles de archivo no son gdi objects...
Saludos
Re: Fuga de recursos
Posted: Tue Jul 30, 2013 1:29 pm
by rolando
Hola,
"Revivo" este post porque me interesaría conocer algo sobre la función mencionada "GetGdiObjects()".
Aclaro que busqué en el foro y la única referencia que encuentro es en este post, por esto consulto: ¿existe esta función realmente?.
De ser así, por favor un ejemplo. Gracias.
Rolando

Re: Fuga de recursos
Posted: Tue Jul 30, 2013 2:55 pm
by Antonio Linares
Rolando,
No existe la function GetGdiObjects() pero si existe la función GetGuiResources():
http://msdn.microsoft.com/en-us/library/ms683192.aspxde todas formas solo te da el número de objetos en uso, y nada más.
Usando SetResDebug( .T. ) y CheckRes() y WinExec( "notepad checkres.txt" ) puedes ver todos los que tu aplicación no ha liberado y además te indica desde que lugar de tu aplicación cada uno de ellos se creó

Re: Fuga de recursos
Posted: Tue Jul 30, 2013 3:56 pm
by rolando
Antonio,
Ya vengo usando SetResDebug( .T. ) y CheckRes() como indicaras hace un tiempo en otro post. Es más, la "adapté" a mis necesidades y con una tecla de función llamo a la CheckRes() y mediante un xBrowse muestro un array conteniendo la info mientras ejecuto la aplicación.
Me llamó la atención esta función "GetGdiObjects()" , que ahora sé que no existe, y por eso consultaba. Muchas Gracias.
Rolando

Re: Fuga de recursos
Posted: Tue Jul 30, 2013 4:13 pm
by Antonio Linares
Rolando,
He vuelto a buscar por si acaso, y de casualidad he encontrado esto que tambien puede resultar muy util:
http://www.nirsoft.net/utils/gdi_handles.html