Jump to content
Fivewin Brasil

Uso de memória


AcessoSoft

Recommended Posts

Olá nobres colegas,

Através do gerenciador de processos do windows, notei que meu EXECUTÁVEL aumenta o uso de memória quando abro uma dialog ou chamo qualquer função do sistema, o que é perfeitamente aceitável, entretanto, notei que ao fechar a dialog ou encerrar a função, a quantidade de memória usada não diminui. Resultado: Após alguns minutos de "abre e fecha" dialogs no meu sistema, o uso da memória alcança valores bem altos.

Minha pergunta é: Além de encerrar os controles e dialogs usando o método :End(), existe alguma função ou comando que preciso chamar pra limpar a memória liberando o espaço utilizado pela rotina que está sendo encerrada?

Agradeço antecipadamente.

Link to comment
Share on other sites

Exemplo simples:

#include "fivewin.ch"
	function main()
	   local oWnd
   local oMenu
	   SetResDebug( .T. ) // PARA CHECAR O USO DOS RECURSOS.
   
   menu oMenu
	      MenuItem "From Code" action FromCode( oWnd )
	      MenuItem "From Resource" action FromrES( oWnd )
	   endmenu  
	   define window oWnd title "Test Button Get Transparent" menu oMenu pixel
   
   activate window oWnd MAXIMIZED
	   if File( "checkres.txt" )
      FErase( "checkres.txt" )
   endif
	   CheckRes()
	   // RETORNO DE: checkres.txt
   // 07/31/18 11:58:45: C:\FWH1701\samples\TESTE.exe -- ====================================================================================================
	   // COLOQUE EM UMA FUNCAO DE SAIDA DO SISTEMA E BEM MELHOR.
   // DBCLOSEALL()
	   FreeResources()
   SysRefresh()
	   RELEASE All
   Hb_GCAll( .T. )
	   CLEAR MEMORY
   PostQuitMessage( 0 )
	   __QUIT()
 
return oWnd   
	Function FromCode( oWnd )
   local oDlg
   local oGet1, oGet2, oGet3, oGet4
   local cVar1, cVar2, cVar3, cVar4
   local lActive := .f.
	   LOCAL T_ATIVIDADE := "03"
   
   cVar1 := 0
   cVar2 := 0
   cVar3 := 0
   cVar4 := 0
   
   Hb_GCAll( .F. )
   
   define dialog oDlg title "From Code" pixel size 300,300
	   @ 10,10 get oGet1 var cVar1 bitmap "..\bitmaps\on.bmp" action( msginfo( "With Transparent" ) ) of oDlg pixel size 60,12
   @ 40,10 get oGet2 var cVar2 bitmap "..\bitmaps\on.bmp" action( msginfo( "Without Transparent" ) ) of oDlg pixel size 60,12
   @ 70,10 get oGet3 var cVar3 bitmap "..\bitmaps\chkyes.bmp" action( msginfo( "With Adjust-Transparent" ) ) of oDlg pixel size 120,12
	   @ 100,10 get oGet4 var cVar4 bitmap "..\bitmaps\chkyes.bmp" ;
   action( if( lActive,oGet3:disable(),oGet3:enable()), lActive:= !lActive, oDlg:update() ) of oDlg pixel size 120,12
	/*
   oGet4:cToolTip:= {"Digite o Código ou Passe o Código de Barras"+CRLF+CRLF+;
                      "Para Importar Orçamentos Digite "+CRLF+ ;
                      " O=xxxx  (Numero Orçamento)"+CRLF+CRLF+ ;
                      "Para Digitar Produtos Avulsos"+CRLF+"-1 e Tecle Enter" + ;
                     IIF( T_ATIVIDADE="04",''+CRLF+CRLF+;
                          'Para Buscar Ordem de Serviço'+CRLF+;
                          'S=xxxxx (Numero da Ordem de Serviço)',''),"Ajuda","", }
*/
	   oGet4:cToolTip := ( "Digite o Código ou Passe o Código de Barras "+CRLF+CRLF+;
                       "Para Importar Orçamentos Digite O=xxxx      "+      ;
                       "(Numero Orçamento) Para Digitar Produtos    "+      ;
                       "Avulsos -1 e Tecle Enter " )
	                    /*+ ;
                     IIF( T_ATIVIDADE="04",''+CRLF+CRLF+;
                          'Para Buscar Ordem de Serviço'+CRLF+;
                          'S=xxxxx (Numero da Ordem de Serviço)',''),"Ajuda","", }*/
	
   
   oGet1:lBtnTransparent := .t.       // transparent button get oGet1
   
   oGet3:disable()
   oGet3:lBtnTransparent := .t.       // transparent button get oGet3
   oGet3:lAdjustBtn      := .t.       // Button Get Adjust Witdh oGet3
   oGet3:lDisColors      := .f.       // Deactive disable color
   oGet3:nClrTextDis     := CLR_WHITE // Color text disable status
   oGet3:nClrPaneDis     := CLR_BLUE  // Color Pane disable status
   
   oGet4:lAdjustBtn      := .t.
   
   activate dialog oDlg centered
	   Hb_GCAll( .T. )
 
return nil
   
Function FromRes( oWnd )
   local oDlg
   local oGet1, oGet2, oGet3, oGet4
   local cVar1, cVar2, cVar3, cVar4
   local lActive := .f.
   
   cVar1 := 0
   cVar2 := 0
   cVar3 := 0
   cVar4 := 0
	   Hb_GCAll( .F. )
   
   define dialog oDlg resource "fromres" of oWnd
	   redefine get oGet1 var cVar1 id 100 bitmap "on" action( msginfo( "With Transparent" ) ) of oDlg  
   redefine get oGet2 var cVar2 id 101 bitmap "on" action( msginfo( "Without Transparent" ) ) of oDlg 
   redefine get oGet3 var cVar3 id 102 bitmap "chkyes" action( msginfo( "With Adjust-Transparent" ) );
   COLOR CLR_BLACK, CLR_CYAN of oDlg 
   redefine get oGet4 var cVar4 id 103 bitmap "chkyes" ;
   action( if( lActive,oGet3:disable(),oGet3:enable()), lActive:= !lActive, oDlg:update() ) of oDlg 
   
   oGet1:lBtnTransparent := .t.       // transparent button get oGet1
   
   oGet3:disable()
   oGet3:lBtnTransparent := .t.       // transparent button get oGet3
   oGet3:lAdjustBtn      := .t.       // Button Get Adjust Witdh oGet3
   oGet3:lDisColors      := .f.       // Deactive disable color
   oGet3:nClrTextDis     := CLR_WHITE // Color text disable status
   oGet3:nClrPaneDis     := CLR_BLUE  // Color Pane disable status
	   
   oGet4:lAdjustBtn := .t.
   
   activate dialog oDlg centered
	   Hb_GCAll( .T. )
 
return nil
	/*
// TESTE.RC
// RESOURCE SCRIPT generated by "Pelles C for Windows, version 5.00".
#ifndef __64__
  1 24 "winxp\WindowsXP.Manifest" 
#endif
	#ifdef __64__
  1 24 "winxp\WindowsXP.Manifest64"
#endif 
	
FROMRES DIALOG 0, 0, 150, 150
STYLE DS_MODALFRAME | WS_BORDER | WS_DLGFRAME | WS_POPUP | WS_SYSMENU
FONT 8, "MS Sans Serif"
CAPTION "Dialog"
BEGIN
    EDITTEXT        100, 11, 10, 80, 15, ES_AUTOHSCROLL
    EDITTEXT        101, 10, 40, 80, 15, ES_AUTOHSCROLL
    EDITTEXT        102, 9, 70, 129, 17, ES_AUTOHSCROLL
    EDITTEXT        103, 10, 100, 130, 14, ES_AUTOHSCROLL
END
	ON BITMAP "..\bitmaps\on.bmp"
	CHKYES BITMAP "..\bitmaps\chkyes.bmp"
*/


 

Link to comment
Share on other sites

Uso as variáveis muito bem classificadas. Todas STATIC ou LOCAL. Se tiver alguma PRIVATE é por mero esquecimento de declarar como LOCAL.

Fiz alguns testes com samples do fivewin e noto que essa alocação de memória contínua se repete em todos executáveis.

Em resumo: o tamanho de memória utilizada mostrado no gerenciador de processos do windows só aumenta. Nunca diminui.

Em relação à sugestão do Kapaiaba em chamar a função HB_GCALL() para esvaziar a memória, apesar de ser teoricamente ideal, não funciona.

O o método End() já chama essa função toda vez que uma dialog é fechada pelo método "oDialog:End()".

B_GCALL libera blocos de memória não usados pelo EXE, porém, o que parece estar acontecendo é que esses blocos não estão sendo marcados como LIXO para que a função HB_GCALL limpe.

E agora? O que fazer?

Link to comment
Share on other sites

 

Uso as variáveis muito bem classificadas. Todas STATIC ou LOCAL. Se tiver alguma PRIVATE é por mero esquecimento de declarar como LOCAL.

Fiz alguns testes com samples do fivewin e noto que essa alocação de memória contínua se repete em todos executáveis.

Em resumo: o tamanho de memória utilizada mostrado no gerenciador de processos do windows só aumenta. Nunca diminui.

Em relação à sugestão do Kapaiaba em chamar a função HB_GCALL() para esvaziar a memória, apesar de ser teoricamente ideal, não funciona.

O o método End() já chama essa função toda vez que uma dialog é fechada pelo método "oDialog:End()".

B_GCALL libera blocos de memória não usados pelo EXE, porém, o que parece estar acontecendo é que esses blocos não estão sendo marcados como LIXO para que a função HB_GCALL limpe.

E agora? O que fazer?

Também costumo declarar as variáveis locais e private. Porém tenho dúvidas com relação as variáveis Static, qual a vantagem e quando devo utilizá-las?

Link to comment
Share on other sites

Exemplo:

STATIC lLigaBotao := .F., lAtrasa10Minutos := .F., oDlg, cTitleDial, oWnd,  ;
       oTimerRelog, lSemPreviewCCe := .F., lChamaAdobe := .F.,              ;
       lVemSemPreview := .T., oSayQtCarac, lNaoLigaNada := .F.
	REQUEST OrdKeyNo, OrdKeyCount, OrdCreate, OrdKeyGoto
	FUNCTION MYFUNCTION()
	...
	
STATIC NEW_FUNCTION() // somente es modulo enxerga.

Link to comment
Share on other sites

A vantagem das variáveis do tipo STATIC é que elas funcionam como PUBLIC mas somente dentro do PRG onde ela foi declarada.

Após encerrar o PRG onde as STATIC´s foram declaradas, essas variáveis não ficam mais acessíveis. Entretanto, se seu código chamar novamente o PRG onde a variável foi declarada, ela pode novamente ser lida, inclusive contendo o último valor que possuía após encerrar o PRG.

Uso pouco as variáveis do tipo STATIC mas são bem úteis quando preciso armazenar um valor pra ser lido posteriormente no PRG onde a variável foi declarada.

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...
×
×
  • Create New...