Page 1 of 1
Como cerrar recursos no usados
Posted: Fri Apr 13, 2012 11:28 am
by rolitocere
Buen día,
Tengo un problema que no logro solucionar y es que al querer cerrar recursos cuando estos se dejan de utilizar, no puedo hacerlo y se van acumulando en memoria.
Pongo un ejemplo de esto:
Abro un dialog, y al cerrarlo se puede ver:
Uploaded with
ImageShack.us
Si lo abro y cierro dos veces más, se puede observar en los recursos:
Uploaded with
ImageShack.us
En lo que respecta a las líneas afectadas en forma directa por mi programa son tres y las incluyo a continuación:
Code: Select all
define font oFonte NAME "Arial" SIZE 6,16 // línea 73 de AGENDIARIA.PRG
define brush oBrush2 resource "IRON" // línea 76 de AGENDIARIA.PRG
oBrw := TXBrowse():New( oDlg ) // línea 88 de AGENDIARIA.PRG
Debo agregar que uso recursos desde una DLL, los dialog son NOWAIT y cierro los recursos en el valid al cerrar el dialog.
Un punto es que no entiendo porque no se cierran los recursos de las líneas de la funcion AGENDIARIA.
El otro punto es, ¿porque se acumulan recursos de las clases TXBROWSE y TRICHEDIT?
Gracias por cualquier ayuda que puedan darme
Rolo
Re: Como cerrar recursos no usados
Posted: Fri Apr 13, 2012 12:03 pm
by karinha
ACTIVATE DIALOG oDlg...
oFonte:End()
oBrush2:End()
RELEASE ALL
RETURN NIL
Re: Como cerrar recursos no usados
Posted: Fri Apr 13, 2012 3:26 pm
by rolitocere
Gracias Karinha,
Pude resolver a medias. Me había olvidado del Release All.
Pero sigo teniendo problemas con la línea:
Code: Select all
oBrw := TXBrowse():New( oDlg ) // línea 88 de AGENDIARIA.PRG
que indica que no se cierra un cursor que en realidad, si lo cierro. Lo que pasa es que aparentemente la TXBrowse es lo que ocasiona el problema.
También todos los BMP que no cierra la TXBROWSE y el FONT que no cierra la TRICHEDIT.
¿Cómo se hace para que la TXBROWSE y la TRICHEDIT cierren esos recursos?
Gracias.
Rolo
Re: Como cerrar recursos no usados
Posted: Fri Apr 13, 2012 6:04 pm
by Antonio Linares
Rolo,
Que versión de FWH usas ?
Re: Como cerrar recursos no usados
Posted: Fri Apr 13, 2012 7:02 pm
by rolitocere
Antonio,
Uso la 10.04
Gracias
Rolo
Re: Como cerrar recursos no usados
Posted: Sat Apr 14, 2012 12:25 pm
by rolitocere
Buen día,
Estuve revisando las clases en cuestión (TRICHEDIT y TXBROWSE). Debo informar que a estas dos clases le hice un par de pequeñas reformas que usualmente comento al comienzo del PRG y por eso las líneas en las que se indica el error no coincide con las del PRG de las clases originales.
Las "reformas" no afectan a los métodos en cuestión en absoluto, son solo DATAS agregadas para poder, con un simple estado lógico (.f. ó .t.), lograr activar/desactivar alguna función.
Por esto es que publico las líneas de los METHOD's de las clases respectivas en donde se detecta la falla o falta de cierre de objetos.
Clase TRICHEDIT, METHOD ReDefine
Code: Select all
oWnd := GetWndDefault() // línea 480
Clase TXBROWSE, METHOD SetBackGround
Code: Select all
hBmp := ResizeBitmap( uBack:hBitmap ) // línea 4817
oBrush := TBrush():New( nil, nil, nil, nil, hBmp ) // línea 4826
Clase TXBROWSE, METHOD Adjust()
Cualquier ayuda será bienvenida. Gracias.
Rolo
Re: Como cerrar recursos no usados
Posted: Sat Apr 14, 2012 5:17 pm
by Antonio Linares
Rolo,
Puedes proporcionar un ejemplo pequeño y autocontenido que genere esos recursos sin liberar para que lo probemos aqui ? gracias
Re: Como cerrar recursos no usados
Posted: Sun Apr 15, 2012 1:58 pm
by rolitocere
Antonio,
Adjunto ejemplo, son dos PRG's y un RES. El primer PRG es el TESTRECURSOS.PRG
Subo todo comprimido a un servidor pues no encuentro el modo de subir un .RES al foro.
(lo volví a subir porque había olvidado un prg)
Disculpa las molestias. Gracias.
Rolo
https://rapidshare.com/files/1980224194 ... cursos.rar
Re: Como cerrar recursos no usados
Posted: Mon Apr 16, 2012 5:15 pm
by rolitocere
Buenas tardes,
Comento resultados usando las clases originales del FWH 10.04 + xHarbour
Estado de los recursos al abrir sólo la ventana principal:
Uploaded with
ImageShack.us
Estado de los recursos al abrir 3 veces el diálogo:
Uploaded with
ImageShack.us
Estado de los recursos al abrir 6 veces el diálogo:
Uploaded with
ImageShack.us
Como puede observarse, cada vez que se abre el dialog aumenta el consumo de recursos.
¿Alguna pista para solucionarlo?. Gracias.
Rolo
Re: Como cerrar recursos no usados
Posted: Mon Apr 16, 2012 6:17 pm
by rolitocere
Hola,
Por mis medios logré reducir algo del RICHEDIT y algo del TXBROWSE agregando esto al final del activate dialog:
Code: Select all
oRichAgDiaria:oFont:end() ,;
oBrw:oCursor:end() , ;
oBrw:oBrush:end() , ;
.t. )
Faltaría todavía algo del TRICHEDIT y algo del TXBROWSE.
Rolo
Re: Como cerrar recursos no usados
Posted: Mon Apr 16, 2012 8:11 pm
by Antonio Linares
Rolo,
Modificando tu PRG de ejemplo de esta forma, solo queda un bitmap por localizar y liberar, usando FWH 12.03:
rolo.prg
Code: Select all
// Test para ver los recursos consumidos
#include "FIVEWIN.Ch"
#include "richedit.ch"
#include "xbrowse.ch"
#include "Selector.ch"
#include "ORD.CH"
Function Primera()
local aAG:={} , cPartFecha:="/04/2012"
// set resources to "TestRecursos.dll"
set date british
set epoch to 1960
set century on
set key VK_F10 to CheckRes()
set deleted on /// No se ven los registros borrados
SetResDebug( .T. )
REQUEST HB_LANG_ES
RddSetDefault("DBFCDX")
REQUEST DBFCDX, DBFFPT
REQUEST ordkeyno, ordkeycount, ordkeygoto
if file("AG.DBF")
Ferase("AG.DBF")
endif
if file("AG.FPT")
Ferase("AG.FPT")
endif
if file("AG.CDX")
Ferase("AG.CDX")
endif
aAG := {{ "FECHA" , "D" , 8 , 0} , ;
{ "NOTA" , "M" , 10 , 0}}
DbCreate( "AG.DBF", aAG, "DbfCdx" )
USE "AG" Excl New Via "DbfCdx"
For f = 10 to 25
dbappend()
replace AG->FECHA with ctod(str(f)+cPartFecha)
replace AG->NOTA with ("Test de recursos "+str(f))
next
dbclosearea()
Define window oWnd ;
from 100,100 to 600,800 pixel;
menu Buildmenu();
title "Test de Recursos"
Activate window oWnd on init msginfo("Usar F10 para hojear recursos utilizados"+chr(13)+"y ver los fallos al cerrar")
set resources to
CheckRes()
Return nil
Function Buildmenu()
local oMenu , oPrueba , oSalir , oHelp
menu oMenu 2007
menuitem "Pruebas" message 'Pruebas de borrado de recursos'
menu
menuitem oPrueba prompt '&Cargo Diálogo' action AgenDiaria() ; // action (oListarVAP:disable() , ListarVAP(oListarVAP)) ;
message 'Cargar dialogo en ventana para aumentar recursos'
menuitem oHelp prompt '&Ayuda' action msginfo("Usar F10 para hojear recursos utilizados y ver los fallos al cerrar") ;
message 'Ayuda'
menuitem oSalir prompt '&Salir' action oWnd:end() ;
message 'Salir'
endmenu
endmenu
Return (oMenu)
//----------------------------------------------------------------------------//
Function AgenDiaria() // con xBrowse
local oBrw , oDbf , oDlg , nAregi , oCol , oRichAgDiaria , cRichAgDiaria , oBrush , oFonte , oBrush2
local cAgenDiaria:=cGetNewAlias('AgenDi') , oCur1
use "AG" shared new alias (cAgenDiaria)
DATABASE oDbf
oDbf:SetOrder( 1, ".\DBF's\AGDIARIA.CDX" )
define font oFonte NAME "Arial" SIZE 6,16
define cursor oCur1 resource 222
define brush oBrush resource "BEIGE2"
define brush oBrush2 resource "IRON"
Define dialog oDlg resource "AGENDIARIA" of oWnd brush oBrush icon "CALENDARIO"
oDlg:lHelpIcon := .f. // saca el "?" de ayuda del dialog *** ATENCION, SOLO FUNCIONA, SI EN EL DLL >>> "AYUDA CONTEXTUAL = NO "
redefine richedit oRichAgDiaria var cRichAgDiaria id 4002 of oDlg
oBrw := TXBrowse():New( oDlg )
nAregi:=oDbf:reccount()
oBrw:nHeaderLines := 1
oBrw:lFastEdit := .T.
oBrw:SetoDbf( oDbf )
oBrw:setfont(oFonte)
oBrw:SetBackGround(oBrush2)
oBrw:lContrastClr := .f. // para evitar que _ salgan aleatoriamente con otra tinta
oCol := oBrw:AddCol()
oCol:cHeader := "FECHA"
oCol:bStrData := { || dtoc(oDbf:FECHA) } //{ || oDbf:FECHA}
oCol:nHeadStrAlign := AL_CENTER
oCol:nDataStrAlign := AL_LEFT
oCol:nWidth := 99
oBrw:oCursor:=oCur1
oBrw:aCols[ 1 ]:AddResource( "CALENDARIO" )
oBrw:aCols[ 1 ]:nBtnBmp := 1
oBrw:aCols[ 1 ]:nEditType := EDIT_GET_BUTTON
oBrw:nMarqueeStyle := MARQSTYLE_HIGHLROW
oBrw:lHScroll:=.f.
oBrw:SetRDD()
oBrw:CreateFromResource( 4001 )
oBrw:bSkip = { | nRecs | oDbf:Skipper( nRecs ) }
oBrw:bChange = {|| cTexto:=oDbf:NOTA , oRichAgDiaria:loadasrtf(cTexto) , ;
oRichAgDiaria:settext(cTexto) , oRichAgDiaria:refresh() }
oRichAgDiaria:bgotfocus:={||oRichAgDiaria:SetBkGndColor(nRgb(223,228,255)) }
oRichAgDiaria:blostfocus:={||oRichAgDiaria:SetBkGndColor(nRgb(255,255,255)) } // , ;
Activate dialog oDlg centered nowait ;
on init ( cTexto:=oDbf:NOTA , oRichAgDiaria:loadasrtf(cTexto) , ;
oRichAgDiaria:settext(cTexto) , oRichAgDiaria:refresh()) ;
valid ( CloseoDbfxBro(oBrw,oDbf) , ;
oBrush:end(), oBrush2:End(),;
oCur1:end(),;
oCur1:end(),;
oFonte:End(), oFonte:End(), oRichAgDiaria:oFont:End(),;
oBrw:aCols[ 1 ]:oBtnList:End(), oBrw:aCols[ 1 ]:oBtnElip:End(),;
DeleteObject( oBrw:aCols[ 1 ]:aBitmaps[ 1, 1 ] ), .T. )
// release all
return nil
//----------------------------------------------------------------------------//
//-----------------------------------------------------------------------------------------------------------------------
Function CloseoDbfxBro(oBrw,oDbf) // para que no de error cerrando la aplicación si al cerrar
// el dialog si el kinetic se está moviendo
oBrw:bKeyCount := { || 0 }
oBrw:bKeyNo := { || 0 }
// oDbf:close()
oBrw:cAlias = ""
Return nil
//-----------------------------------------------------------------------------------------------------------------------
checkres.txt
Code: Select all
16/04/2012 22:10:10: BMP,-1979378897,TXBRWCOLUMN:ADJUST(8707)->TXBROWSE:ADJUST(984)->TXBROWSE:INITIATE(882)->__OBJSENDMSG(0)->OSEND(210)->ASEND(178)->TDIALOG:INITIATE(630)->TDIALOG:ACTIVATE(298)->AGENDIARIA(164)->(b)BUILDMENU(76)->TMENU:COMMAND(461)->TWINDOW:COMMAND(1033)->TWINDOW:HANDLEEVENT(0)->_FWH(3159)->WINRUN(0)->TWINDOW:ACTIVATE(980)->PRIMERA(57)
16/04/2012 22:10:10: ====================================================================================================
Re: Como cerrar recursos no usados
Posted: Mon Apr 16, 2012 10:24 pm
by rolitocere
Antonio,
Gracias por responder pero lamentablemente sigue dando los mismos errores (usando el FWH 10.04).
Lo que si logré avanzar con lo comentado en mi post anterior y, cuando logre "sacar" todo, comentaré como lo hice.
Gracias.
Rolo
Re: Como cerrar recursos no usados
Posted: Tue Apr 17, 2012 6:40 am
by Antonio Linares
Rolo,
Desde la versión 10.4 a la actual 12.03 se ha trabajado mucho en que no quede ningún recurso pendiente. Piensa que cada vez que incorporamos una nueva clase a FiveWin existe la posibilidad de que algún recurso no se haya controlado totalmente, de ahi que siempre andamos comprobando y afinando que no haya consumo de recursos.
Pero, sinceramente, es imposible decirte que modificaciones tienes que aplicar a la versión 10.4 para que no te aparezca nada. Son _ los que se hacen cada año.