AcessoSoft Posted July 31, 2018 Report Share Posted July 31, 2018 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. Quote Link to comment Share on other sites More sharing options...
fladimir Posted July 31, 2018 Report Share Posted July 31, 2018 Se não me engano HB_GCAll( .T. ) Quote Link to comment Share on other sites More sharing options...
AcessoSoft Posted July 31, 2018 Author Report Share Posted July 31, 2018 O que sugere é chamar a função: HB_GCALL(.T.) ao encerrar uma rotina e retornar ao MAIN Fladimir? Testei em alguns módulos aqui mas não diminui o uso da memória. Toda vez que entro numa rotina e encerro, o uso de memória aumenta mesmo chamando HB_GCALL(.T.) Quote Link to comment Share on other sites More sharing options...
fladimir Posted July 31, 2018 Report Share Posted July 31, 2018 Exato, chamar essa rotina ao encerrar a rotina, mas pelo q vi vc fez isso e não deu certo, então não saberia informar o q poderia ajudar, talvez algum colega saiba. KennethTymnLY 1 Quote Link to comment Share on other sites More sharing options...
kapiaba Posted July 31, 2018 Report Share Posted July 31, 2018 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" */ Quote Link to comment Share on other sites More sharing options...
jfaguiar Posted July 31, 2018 Report Share Posted July 31, 2018 Olá Kapiaba. Não me xinga se eu estiver errado, mas " Release oDlg* " não resolve isso? Tenta também usar essas functions como "STATIC FUNCTION" quando elas só forem chamadas do mesmo prg onde a mesma se encontra. Quote Link to comment Share on other sites More sharing options...
AcessoSoft Posted August 1, 2018 Author Report Share Posted August 1, 2018 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? Quote Link to comment Share on other sites More sharing options...
rochinha Posted August 1, 2018 Report Share Posted August 1, 2018 Amiguinhos, AcessoSoft Desligue os antivirus e CORE do Warsaw. Quote Link to comment Share on other sites More sharing options...
jfaguiar Posted August 1, 2018 Report Share Posted August 1, 2018 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? Quote Link to comment Share on other sites More sharing options...
kapiaba Posted August 1, 2018 Report Share Posted August 1, 2018 Tudo que é STATIC, somente o módulo em que entras "enxerga". Altamente recomendável para .T. .or. .F. KennethTymnLY 1 Quote Link to comment Share on other sites More sharing options...
kapiaba Posted August 1, 2018 Report Share Posted August 1, 2018 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. Quote Link to comment Share on other sites More sharing options...
AcessoSoft Posted August 2, 2018 Author Report Share Posted August 2, 2018 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. kapiaba 1 Quote Link to comment Share on other sites More sharing options...
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.