Fórum Liberar memoria usada em Cliente #275650

05/04/2005

0

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?


Xanatos

Xanatos

Responder

Posts

05/04/2005

Edilcimar

já tentou freemem?


Responder

Gostei + 0

05/04/2005

Rjun

Voce esta criando algum objeto a cada leitura ?


Responder

Gostei + 0

05/04/2005

Xanatos

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...



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;



Responder

Gostei + 0

05/04/2005

Massuda

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,
var
  X: IEnumVariant;
....
  ListaProcessos(X);
  X := nil;
[*:d28cfd2091]No código de sua procedure, no final do loop, nil´zar as interfaces
    ...
    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;
[/list:u:d28cfd2091]


Responder

Gostei + 0

05/04/2005

Xanatos

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


Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar