Liberar memoria usada em Cliente
Tenho uma aplicacao cliente que é apenas um Form e de tempo em tempo (a cada 30 segundos mais ou menos) ele executa um procedimento que preenche um strgrid com todos os processos que estao executando no momento na maquina.
o Problema é que a cada execucao da procedure aumenta 70 k ao uso de memoria do programa...
como resolver isso?
o Problema é que a cada execucao da procedure aumenta 70 k ao uso de memoria do programa...
como resolver isso?
Xanatos
Curtidas 0
Respostas
Edilcimar
05/04/2005
já tentou freemem?
GOSTEI 0
Rjun
05/04/2005
Voce esta criando algum objeto a cada leitura ?
GOSTEI 0
Xanatos
05/04/2005
BOm...é esse procedimento que esta acumulando memoria no meu aplicativo...
Enum.Next(1,v,cFetched);
Mais ao isolar codigo...eu descobri que é essa funcao que esta fazendo isso...mas mesmo usando FreeMem, FreeandNil...atribuiando Nil ...em todas as variaveis dessa minha procedure e nao adiantou...
Enum.Next(1,v,cFetched);
Mais ao isolar codigo...eu descobri que é essa funcao que esta fazendo isso...mas mesmo usando FreeMem, FreeandNil...atribuiando Nil ...em todas as variaveis dessa minha procedure e nao adiantou...
procedure TfrmTerminal.ListaProcessos(Enum: IEnumVARIANT); var i,j,ContLinha:integer; idi:IDispatch; v:OleVariant; cFetched: Cardinal; WbemObject:ISWbemObject; Enum2: IEnumVARIANT; begin i:= 1; ContLinha:= 1; while true do begin Enum.Next(1,v,cFetched); // Essa aqui olha! if(cFetched = 0) then begin break; end; with pbx do Position:= Position+1; idi:= v; idi.QueryInterface(IID_ISWbemObject,WbemObject); Enum2:=WbemObject.Properties_._NewEnum as IEnumVariant; sgProcessos.Cells[1,Contlinha]:= WbemObject.Path_.Path; inc(ContLinha); inc(i); end; end;
GOSTEI 0
Massuda
05/04/2005
Talvez sejam as interfaces... experimente[list:d28cfd2091][*:d28cfd2091]No código que chama sua ListaProcessos, nil´zar a variável que você passa como parametro,[*:d28cfd2091]No código de sua procedure, no final do loop, nil´zar as interfaces[/list:u:d28cfd2091]
var X: IEnumVariant; .... ListaProcessos(X); X := nil;
... idi:= v; idi.QueryInterface(IID_ISWbemObject,WbemObject); Enum2:=WbemObject.Properties_._NewEnum as IEnumVariant; sgProcessos.Cells[1,Contlinha]:= WbemObject.Path_.Path; inc(ContLinha); inc(i); Enum2 := nil; WbemObject := nil; idi:= nil; end;
GOSTEI 0
Xanatos
05/04/2005
Bom...o que resolveu realmente foi essa atribuicao..
v:= Unassigned;
Mas ainda estou usando ainda dentro do looping...essas outras
idi:= nil;
FreeAndNil(idi);
WbemObject:= Nil;
FreeAndNil(WbemObject);
Aparentemente elas nao adiantam mas a primeira atribuicao resultou na economia de 120k por chamada... pois dentro desse procedimento chamo outro semelhante... mas ainda ta havendo um acrescimo de memoria...de 4 k ...mas ja melhorou muito... Valeu
v:= Unassigned;
Mas ainda estou usando ainda dentro do looping...essas outras
idi:= nil;
FreeAndNil(idi);
WbemObject:= Nil;
FreeAndNil(WbemObject);
Aparentemente elas nao adiantam mas a primeira atribuicao resultou na economia de 120k por chamada... pois dentro desse procedimento chamo outro semelhante... mas ainda ta havendo um acrescimo de memoria...de 4 k ...mas ja melhorou muito... Valeu
GOSTEI 0