![]() |
WMI Speicherfresser wie beseitiegen
Servus,
habe mir aus dem Web ne Methode gesucht um per WMI auf Daten zu zugreifen.
Delphi-Quellcode:
Nur oben dieser Code, wenn ich den per Timer immer wieder aufrufe, wird der Speicher größer und größer.
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; Bei FastMM4 ist alles ok. Habe schon versucht Variablen freizugeben, aber nichts nur fehler. Wie muss ich die sachen wieder freigeben? Mfg |
Re: WMI Speicherfresser wie beseitiegen
Zitat:
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? |
Re: WMI Speicherfresser wie beseitiegen
Delphi-Quellcode:
Neuen CoSWbemLocator erstellen und Methode Free aufrufen?
Enum := CoSWbemLocator.free;
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. |
Re: WMI Speicherfresser wie beseitiegen
Zitat:
Speicherauslastung im Taskmanager meinte ich.
Delphi-Quellcode:
Wenn ich die While Schleife raus nehme habe ich keinen Fresser mehr.
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 |
Re: WMI Speicherfresser wie beseitiegen
Zitat:
Delphi-Quellcode:
sollte bei Interfaces reichen!
Enum := nil
|
Re: WMI Speicherfresser wie beseitiegen
Zitat:
|
Re: WMI Speicherfresser wie beseitiegen
keiner ne idee?
|
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; ![]() |
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: ![]() siehe auch hier: ![]() |
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 06:21 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz