Como cerrar recursos no usados

Como cerrar recursos no usados

Postby rolitocere » Fri Apr 13, 2012 11:28 am

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

Re: Como cerrar recursos no usados

Postby karinha » Fri Apr 13, 2012 12:03 pm

ACTIVATE DIALOG oDlg...

oFonte:End()
oBrush2:End()

RELEASE ALL

RETURN NIL
João Santos - São Paulo - Brasil - Phone: +55(11)95150-7341
User avatar
karinha
 
Posts: 7437
Joined: Tue Dec 20, 2005 7:36 pm
Location: São Paulo - Brasil

Re: Como cerrar recursos no usados

Postby rolitocere » Fri Apr 13, 2012 3:26 pm

Gracias Karinha,

Pude resolver a medias. Me había olvidado del Release All.

Pero sigo teniendo problemas con la línea:

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

Re: Como cerrar recursos no usados

Postby Antonio Linares » Fri Apr 13, 2012 6:04 pm

Rolo,

Que versión de FWH usas ?
regards, saludos

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

Re: Como cerrar recursos no usados

Postby rolitocere » Fri Apr 13, 2012 7:02 pm

Antonio,

Uso la 10.04

Gracias

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

Re: Como cerrar recursos no usados

Postby rolitocere » Sat Apr 14, 2012 12:25 pm

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  Expand view
oWnd       := GetWndDefault()        // línea 480

Clase TXBROWSE, METHOD SetBackGround
Code: Select all  Expand view
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  Expand view
::CreateButtons()                  // línea 8001


Cualquier ayuda será bienvenida. Gracias.

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

Re: Como cerrar recursos no usados

Postby Antonio Linares » Sat Apr 14, 2012 5:17 pm

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

Re: Como cerrar recursos no usados

Postby rolitocere » Sun Apr 15, 2012 1:58 pm

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

Re: Como cerrar recursos no usados

Postby rolitocere » Mon Apr 16, 2012 5:15 pm

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

Postby rolitocere » Mon Apr 16, 2012 6:17 pm

Hola,

Por mis medios logré reducir algo del RICHEDIT y algo del TXBROWSE agregando esto al final del activate dialog:
Code: Select all  Expand view
oRichAgDiaria:oFont:end() ,;
oBrw:oCursor:end() , ;
oBrw:oBrush:end() , ;
.t.  )


Faltaría todavía algo del TRICHEDIT y algo del TXBROWSE.

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

Re: Como cerrar recursos no usados

Postby Antonio Linares » Mon Apr 16, 2012 8:11 pm

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  Expand view
// 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 los caracteres 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  Expand view
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
User avatar
Antonio Linares
Site Admin
 
Posts: 41462
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain

Re: Como cerrar recursos no usados

Postby rolitocere » Mon Apr 16, 2012 10:24 pm

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

Re: Como cerrar recursos no usados

Postby Antonio Linares » Tue Apr 17, 2012 6:40 am

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 muchos cambios los que se hacen cada año.
regards, saludos

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


Return to FiveWin para Harbour/xHarbour

Who is online

Users browsing this forum: Google [Bot] and 156 guests

cron