COMO LIBERAR MEMORIA USADA PELO VB6 SEM RESTARTAR

BESALEEL 28/02/2012 17:43:31
#395964
Tenho um sistema que doi manutenção que foi escrito em VB6 que esta apresentando o seguinte problema. Ele acumula o uso da memória ao longo de seu uso, exemplo, quando ele é startado ele inicia o sistema com consumo de 100kb após 5 dias rodando o consumo já esta em 5mb.

Bem, o problema é que quando o sistema foi escrito o programador declarou todas as variaveis como GLOBAIS, mas, o sistema é muito grande para altera-lo inteiro e eu preciso de uma Solução rápida.

Mais problemas:
Não tenho permissão de instalar nenhum programa no servidor;
O comando (%windir%\system32undll32.exe advapi32.dll,ProcessIdleTasks) não serve para mim;

Preciso adicionar a função alguma rotina que limpe a Memória da APLICAÇÂO.

AJSO 28/02/2012 18:49:40
#395966
Caro BESALEEL

Limpar memória usada pelo sistema ou fazer uma qq outra coisa que não seja uma analise em seu siste apara promover melhorias, fica como quebrar umas paredes de um predio de 40 andares pode até funcionar por um periodo mas e quando quebrar uma parede que faz parte da estrututa de sustentação vai provocar danos a estrutura e pode até a cair.

Seu aplciativo começa com 100kb apos 5 dias fica em 5MB ou seja ele cresce 41,67 kb por hora, se não estou enganado. Isso parece uma trava contra uso sem licença......

Você tem acesso aos fontes da aplicação.......................................
Talves isso seja a forma de não deixa utilizar o sistema sem permissão...........
Esta parecendo que você quer mecher em coisa que não pode..........
VARIAVEIS GLOBAIS podem ser um problema mas tambem pode ser uma solução de bloquear o sistema para não poder usar sem licença.....................................

Por exemplo abrir um recordset e manter aberto apos efetuar transação com o banco causa problemas com o consumo de memória e consumo do banco.

Se tiver acesso ao codigo fonte pode rever estes prcedientos pois talves sua linguagem pode não esta dando conta mais do processo e tenha que migrar para uma outra solução, pensar em soluções até para plataforma x64 onde memória não é problema.


Boa sorte.......
MARCELO.TREZE 28/02/2012 19:38:05
#395969
A minha pergunta é a mesma, você tem acesso ao codigo fonte se sim, vc deverá descarregar todos recodset's, conexoes e etc

BESALEEL 29/02/2012 09:00:02
#396005
Bom dia Senhores,

Sim, tenho acesso ao código fonte, ele foi desenvolvido pela empresa que trabalho em vb6 e não há problemas com licença.

O VB6 usa a memória da seguinte forma, a variavel é instanciada ai ele usa [X] de memória, depois ela recebeu novo valor, agora ela passa a ter [XX] de memória, e se eu não destruir a varial e continuar a usa-la em meu sistema, esse consumo da memória só irá aumentar, é o mesmo problema de concatenação de strings no vb.net.

Por isso correto seria declarar as variaveis como LOCAIS e após sua utilização destrui-las, usando um [Ô]=Nothing[Ô], por exemplo.

A solução mais correta seria re-escrever o código de forma que nao existam mais variaveis GLOBAIS, isso ai meu ver, mais demandaria muitas horas de programação que certamente a empresa que o contratou inicialmente não iria querer pagar.

A solução que eu procuro seria, matar o sistema, limpar todas as variaveis dele ao se chamar uma função por exemplo, de forma que o usuário não perceba.

MARCELO.TREZE 29/02/2012 12:26:17
#396038
olha colega não sei se vai te ajudar

uma vez precisei disto e fiz o seguinte

[ô] fecha os objetos e libera memoria

    On Error Resume Next

Dim ws As Workspace
Dim db As Database
Dim rs As Recordset
[ô]
For Each ws In Workspaces
For Each db In ws.Databases
For Each rs In db.Recordsets
rs.Close
Set rs = Nothing
Next
db.Close
Set db = Nothing
Next
ws.Close
Set ws = Nothing
Next



coloque os códigos acima em um função ou sub, e ela fechará todas data bases, workspaces e recordsets instaladas.


veja se ajuda e boa sorte, eu usei isto no unload do form principal, mas no seu caso teria de se estudar onde colocar esta função

AJSO 29/02/2012 13:11:03
#396051
Caro BESALEEL
Coloque todas as VARIAVEIS GOBAIS declarada em seu código em Function para encerrar o processo delas.

Você não pode destruir antes de fechar senão sua aplicação vai parar de funcionar e gerar erros graves aos dados
Primeiro Verifica se está aberta
se tiver você fecha
Depois esvazia ou destroi com o Nothing...............................

Function FechaPorteiradoMal(ByRef Rsts As Object)
If (Not Rsts Is Nothing) Then [ô] Verifica se rsts é um objeto
If Rsts.State = adStateOpen Then [ô] verifica se a tabela está aberta
Rsts.Close [ô] fecha conexão
End If

Set Rsts = Nothing [ô] destroe variavel
End If

If (Not Cnn Is Nothing) Then verifica se cnn é um objeto
If Cnn.State = adStateOpen Then verifica se a conexão com o BD está aberta
Cnn.Close fecha a conexão com o bd
End If

Set Cnn = Nothing [ô] destroe variavel
End If

End Function


Isso fara o encerramento sem causar problemas para seu código vocÊ pode executar dentro de um TIMMER por exemplo a cada 10 horas executar essa operação.


Boa sorte
Tópico encerrado , respostas não são mais permitidas