Como cerrar recursos no usados

Post Reply
rolitocere
Posts: 41
Joined: Wed Sep 23, 2009 11:50 am

Como cerrar recursos no usados

Post 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:

Image

Uploaded with ImageShack.us

Si lo abro y cierro dos veces más, se puede observar en los recursos:

Image

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
User avatar
karinha
Posts: 4882
Joined: Tue Dec 20, 2005 7:36 pm
Location: São Paulo - Brasil

Re: Como cerrar recursos no usados

Post by karinha »

ACTIVATE DIALOG oDlg...

oFonte:End()
oBrush2:End()

RELEASE ALL

RETURN NIL
João Santos - São Paulo - Brasil
rolitocere
Posts: 41
Joined: Wed Sep 23, 2009 11:50 am

Re: Como cerrar recursos no usados

Post 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
User avatar
Antonio Linares
Site Admin
Posts: 37481
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain
Contact:

Re: Como cerrar recursos no usados

Post by Antonio Linares »

Rolo,

Que versión de FWH usas ?
regards, saludos

Antonio Linares
www.fivetechsoft.com
rolitocere
Posts: 41
Joined: Wed Sep 23, 2009 11:50 am

Re: Como cerrar recursos no usados

Post by rolitocere »

Antonio,

Uso la 10.04

Gracias

Rolo
rolitocere
Posts: 41
Joined: Wed Sep 23, 2009 11:50 am

Re: Como cerrar recursos no usados

Post 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()

Code: Select all

::CreateButtons()                  // línea 8001
Cualquier ayuda será bienvenida. Gracias.

Rolo
User avatar
Antonio Linares
Site Admin
Posts: 37481
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain
Contact:

Re: Como cerrar recursos no usados

Post by Antonio Linares »

Rolo,

Puedes proporcionar un ejemplo pequeño y autocontenido que genere esos recursos sin liberar para que lo probemos aqui ? gracias
regards, saludos

Antonio Linares
www.fivetechsoft.com
rolitocere
Posts: 41
Joined: Wed Sep 23, 2009 11:50 am

Re: Como cerrar recursos no usados

Post 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
rolitocere
Posts: 41
Joined: Wed Sep 23, 2009 11:50 am

Re: Como cerrar recursos no usados

Post 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:

Image

Uploaded with ImageShack.us

Estado de los recursos al abrir 3 veces el diálogo:

Image

Uploaded with ImageShack.us

Estado de los recursos al abrir 6 veces el diálogo:

Image

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
rolitocere
Posts: 41
Joined: Wed Sep 23, 2009 11:50 am

Re: Como cerrar recursos no usados

Post 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
User avatar
Antonio Linares
Site Admin
Posts: 37481
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain
Contact:

Re: Como cerrar recursos no usados

Post 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: ====================================================================================================   
 
regards, saludos

Antonio Linares
www.fivetechsoft.com
rolitocere
Posts: 41
Joined: Wed Sep 23, 2009 11:50 am

Re: Como cerrar recursos no usados

Post 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
User avatar
Antonio Linares
Site Admin
Posts: 37481
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain
Contact:

Re: Como cerrar recursos no usados

Post 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.
regards, saludos

Antonio Linares
www.fivetechsoft.com
Post Reply