AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein WMI Speicherfresser wie beseitiegen
Thema durchsuchen
Ansicht
Themen-Optionen

WMI Speicherfresser wie beseitiegen

Ein Thema von Jackie1983 · begonnen am 24. Nov 2009 · letzter Beitrag vom 21. Okt 2016
Antwort Antwort
Seite 1 von 2  1 2      
Jackie1983

Registriert seit: 12. Mär 2007
486 Beiträge
 
#1

WMI Speicherfresser wie beseitiegen

  Alt 24. Nov 2009, 14:01
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
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#2

Re: WMI Speicherfresser wie beseitiegen

  Alt 24. Nov 2009, 14:21
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?
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu
Online

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.063 Beiträge
 
Delphi 12 Athens
 
#3

Re: WMI Speicherfresser wie beseitiegen

  Alt 24. Nov 2009, 14:33
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.
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.
  Mit Zitat antworten Zitat
Jackie1983

Registriert seit: 12. Mär 2007
486 Beiträge
 
#4

Re: WMI Speicherfresser wie beseitiegen

  Alt 24. Nov 2009, 14:34
Zitat von Luckie:
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.


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.
  Mit Zitat antworten Zitat
Benutzerbild von Bernhard Geyer
Bernhard Geyer

Registriert seit: 13. Aug 2002
17.196 Beiträge
 
Delphi 10.4 Sydney
 
#5

Re: WMI Speicherfresser wie beseitiegen

  Alt 24. Nov 2009, 14:34
Zitat von Jackie1983:
Enum := CoSWbemLocator.free;
Etwas falsche verwendung?

Enum := nil sollte bei Interfaces reichen!
Windows Vista - Eine neue Erfahrung in Fehlern.
  Mit Zitat antworten Zitat
Jackie1983

Registriert seit: 12. Mär 2007
486 Beiträge
 
#6

Re: WMI Speicherfresser wie beseitiegen

  Alt 24. Nov 2009, 14:36
Zitat von himitsu:
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
  Mit Zitat antworten Zitat
Jackie1983

Registriert seit: 12. Mär 2007
486 Beiträge
 
#7

Re: WMI Speicherfresser wie beseitiegen

  Alt 25. Nov 2009, 19:29
keiner ne idee?
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu
Online

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.063 Beiträge
 
Delphi 12 Athens
 
#8

Re: WMI Speicherfresser wie beseitiegen

  Alt 25. Nov 2009, 21:36
'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
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.
  Mit Zitat antworten Zitat
nahpets
(Gast)

n/a Beiträge
 
#9

Re: WMI Speicherfresser wie beseitiegen

  Alt 26. Nov 2009, 08:53
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.
  Mit Zitat antworten Zitat
Benutzerbild von Bernhard Geyer
Bernhard Geyer

Registriert seit: 13. Aug 2002
17.196 Beiträge
 
Delphi 10.4 Sydney
 
#10

Re: WMI Speicherfresser wie beseitiegen

  Alt 26. Nov 2009, 08:59
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.
Windows Vista - Eine neue Erfahrung in Fehlern.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 09:59 Uhr.
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