Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   WMI Speicherfresser wie beseitiegen (https://www.delphipraxis.net/143836-wmi-speicherfresser-wie-beseitiegen.html)

Jackie1983 24. Nov 2009 13:01


WMI Speicherfresser wie beseitiegen
 
Servus,

habe mir aus dem Web ne Methode gesucht um per WMI auf Daten zu zugreifen.
Delphi-Quellcode:
var
  Server: string;
  Enum: IEnumVARIANT;
  varArr: OleVariant;
  lNumElements: ULong;
begin
  Server := '127.0.0.1';
  try
    log.Lines.BeginUpdate;
    Enum := CoSWbemLocator.Create.ConnectServer(Server, 'root\cimv2', '',
      '', '', '', 0, nil).ExecQuery('Select * from Win32_LogicalDisk', 'WQL',
      wbemFlagBidirectional, nil)._NewEnum as IEnumVariant;
(*    while (Succeeded(ADsEnumerateNext(Enum, 1, varArr, lNumElements))) and (lNumElements > 0) do
    begin
      DumpWMI_Process(IUnknown(varArr) as SWBemObject);
    end;*)
    Enum := CoSWbemLocator.free;
  finally
//    FreeAndNil(Enum);
    log.Lines.EndUpdate;
  end;
Nur oben dieser Code, wenn ich den per Timer immer wieder aufrufe, wird der Speicher größer und größer.
Bei FastMM4 ist alles ok.
Habe schon versucht Variablen freizugeben, aber nichts nur fehler.

Wie muss ich die sachen wieder freigeben?

Mfg

Luckie 24. Nov 2009 13:21

Re: WMI Speicherfresser wie beseitiegen
 
Zitat:

Zitat von Jackie1983
Nur oben dieser Code, wenn ich den per Timer immer wieder aufrufe, wird der Speicher größer und größer.

Sei doch froh, andere geben viel Geld für mehr Speicher aus.

Mit der Bezeichnung Speicher lässt sich nicht viel anfangen. Was für ein Speicherverbrauch wird immer höher und wie stellst du das fest?

himitsu 24. Nov 2009 13:33

Re: WMI Speicherfresser wie beseitiegen
 
Delphi-Quellcode:
Enum := CoSWbemLocator.free;
Neuen CoSWbemLocator erstellen und Methode Free aufrufen?
Gibt es überhaupt eine Methode "Free"?

Warum FastMM nix anzeigt ist klar, denn diese Objekte/Befehle nutzen den Speichermanager vom OLE
und nicht den von Delphi (FastMM).


Ja, erstmal Luchie's Fragen beantworten
und dann ... hast di denn schonmal in der DP umgesehn?
Hier sind auch einige andere Dinge vorhanden, mit welchen Zugriff auf WMI bekommt.

Jackie1983 24. Nov 2009 13:34

Re: WMI Speicherfresser wie beseitiegen
 
Zitat:

Zitat von Luckie
Zitat:

Zitat von Jackie1983
Nur oben dieser Code, wenn ich den per Timer immer wieder aufrufe, wird der Speicher größer und größer.

Sei doch froh, andere geben viel Geld für mehr Speicher aus.

:lol:

Speicherauslastung im Taskmanager meinte ich.
Delphi-Quellcode:
function ADsEnumerateNext(pEnumVariant: IEnumVARIANT; cElements: ULONG;
  var pvar: OleVARIANT; var pcElementsFetched: ULONG): HRESULT; safecall; external 'activeds.dll';

//..

while (Succeeded(ADsEnumerateNext(Enum, 1, varArr, lNumElements))) and (lNumElements > 0) do
Wenn ich die While Schleife raus nehme habe ich keinen Fresser mehr.

Bernhard Geyer 24. Nov 2009 13:34

Re: WMI Speicherfresser wie beseitiegen
 
Zitat:

Zitat von Jackie1983
Enum := CoSWbemLocator.free;

Etwas falsche verwendung?

Delphi-Quellcode:
Enum := nil
sollte bei Interfaces reichen!

Jackie1983 24. Nov 2009 13:36

Re: WMI Speicherfresser wie beseitiegen
 
Zitat:

Zitat von himitsu
Delphi-Quellcode:
Enum := CoSWbemLocator.free;
Neuen CoSWbemLocator erstellen und Methode Free aufrufen?
Gibt es überhaupt eine Methode "Free"?

Nein gibt es nicht, hatte ich nur zum Test drin :)

Jackie1983 25. Nov 2009 18:29

Re: WMI Speicherfresser wie beseitiegen
 
keiner ne idee?

himitsu 25. Nov 2009 20:36

Re: WMI Speicherfresser wie beseitiegen
 
'n Versuch
Delphi-Quellcode:
var
  Server: string;
  Enum: IEnumVARIANT;
  varArr: OleVariant;
  lNumElements: ULong;
begin
  Server := '127.0.0.1';
  try
    log.Lines.BeginUpdate;
    Enum := CoSWbemLocator.Create.ConnectServer(Server, 'root\cimv2', '',
      '', '', '', 0, nil).ExecQuery('Select * from Win32_LogicalDisk', 'WQL',
      wbemFlagBidirectional, nil)._NewEnum as IEnumVariant;
    VarClear(varArr); // kann zumindestens nicht schaden
    while Succeeded(ADsEnumerateNext(Enum, 1, varArr, lNumElements)) and (lNumElements > 0) do
    begin
      DumpWMI_Process(IUnknown(varArr) as SWBemObject);
      ADsFreeEnumerator(varArr);
    end;
  finally
    log.Lines.EndUpdate;
  end;
end;
http://www.delphipraxis.net/internal...050512#1050512

nahpets 26. Nov 2009 07:53

Re: WMI Speicherfresser wie beseitiegen
 
Hallo,

die Speicherlöscher kenne ich, habe sie aber bisher nicht wegbekommen, sie liegen (vermutlich) nicht in dem Bereich, auf den Du von Delphi aus Einfluss nehmen kannst. Also quasi jenseits der Schnittstelle.

Bei dem Programm, dass mir die meisten Probleme bereitet hatte, nahm die Zahl der benutzen Handles kontinuierlich zu, bis irgendwann das System keine Resourcen mehr frei hatte. Das Programm wird jetzt per Taskplaner je halbe Stunde gestartet und beendet sich dann, statt selbständig im Halbstundenrhythmus einen Job als "Dauerläufer" bzw. Dienst, zu erledigen.

Die Speicherlöscher habe ich auch schon bei anderen Programmen, die die WMI-Schnittstelle benutzten, beobachten können, die nicht mit Delphi geschrieben wurden. Vermute hier ein generelles Problem.

Schau bitte mal hier: speicher laeuft voll bei wmi.html, bietet leider keine Lösung, aber einige Lösungsansätze, damit Du nicht alles, was bisher nicht funktioniert hat, nochmal durchprobieren muss ;-)

siehe auch hier: http://www.delphipraxis.net/internal...050512#1050512, hilft eventuell.

Bernhard Geyer 26. Nov 2009 07:59

Re: WMI Speicherfresser wie beseitiegen
 
Wenns wirklich Speicherkritisch ist:

Start einen externen Prozess und lass dem die WMI-Aktionen durchführen und dir die Infos liefern. Wenn der Ressourcen-Verlust zu groß ist Start diese Exe neu.


Alle Zeitangaben in WEZ +1. Es ist jetzt 23:11 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz