| Autor |
Beitrag |
Bergmann89
      
Beiträge: 1742
Erhaltene Danke: 72
Win7 x64, Ubuntu 11.10
Delphi 7 Personal, Lazarus/FPC 2.2.4, C, C++, C# (Visual Studio 2010), PHP, Java (Netbeans, Eclipse)
|
Verfasst: Sa 23.02.08 15:37
HI,
ich bin grad dabei n bisl mit WMI zu experimentieren, und da is mir aufgefallen, dass:
Wenn ich mit nem Timer immer wieder die Prozessorlast auslesen lasse, das jedesmal
die Speicherauslastung wächst! Das Prog war ca. ne halbe stunde an und hat 1000MB
Speicher benutz! Ich glaub das liegt daran, das die WMI-Prozedur immer wieder Variablen
erzeugt, aber nich wieder freigibt. Hab aber auch nix gefunden, wie ich das erledigen kann!
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30:
| procedure TForm1.GetWMIstring (wmiHost, wmiClass, wmiProperty : string; var List: TStringList); var Services: ISWbemServices; var SObject: ISWbemObject; var ObjSet: ISWbemObjectSet; var SProp: ISWbemProperty; var Enum: IEnumVariant; var Value: Cardinal; var TempObj: OleVariant; var SN: string; begin List.Clear; try Services := Locator.ConnectServer(wmiHost, 'root\cimv2', '', '', '','', 0, nil); ObjSet := Services.ExecQuery('SELECT * FROM '+wmiClass, 'WQL', wbemFlagReturnImmediately and wbemFlagForwardOnly , nil); Enum := (ObjSet._NewEnum) as IEnumVariant; while (Enum.Next(1, TempObj, Value) = S_OK) do begin SObject := IUnknown(tempObj) as ISWBemObject; SProp := SObject.Properties_.Item(wmiProperty, 0); if VarIsNull(SProp.Get_Value) then List.Add('') else begin SN := SProp.Get_Value; List.Add(SN); end; end; except on exception do List.Add(''); end; end; |
Weiß jemand ne lösung, wäre sehr dankbar!
____
MfG & Thx Bergmann
|
|
olliterski
      
Beiträge: 105
Erhaltene Danke: 2
Win7 64-Bit
D7 Ent.
|
Verfasst: Mo 25.02.08 10:24
Hallo,
also ich hab ehrlich gesagt noch nicht soviel damit rumexperimentiert und bin wahrscheinlich auch schon etwas raus, aber DIE Funktion rufst Du jedesmal über einen Timer auf?
Mit jedem Aufruf von 'Locator.ConnectServer(wmiHost, 'root\cimv2', '', '', '','', 0, nil);' erzeugst Du meines erachtens nach eine neue Instanz ohne die alte freizugeben!
Habe jedenfalls keine Zeile gefunden in der ein 'Disconnect' steht oder ein 'FREE'!
Viele Grüße
Oliver
_________________ Viele Grüße
Oliver
|
|
Motzi
      
Beiträge: 2931
XP Prof, Vista Business
D6, D2k5-D2k7 je Prof
|
Verfasst: Mo 25.02.08 11:38
Die Referenzzähler von Interfaces werden von Delphi intern automatisch verwaltet, somit sollten alle Interfaces aus deiner Funktion freigegeben werden, sobald diese fertig ist.
Möglicherweise liegt das Problem woanders..?
Gruß, Motzi
_________________ gringo pussy cats - eef i see you i will pull your tail out by eets roots!
|
|
Bernhard Geyer
      
Beiträge: 721
Erhaltene Danke: 3
|
Verfasst: Mo 25.02.08 18:39
Motzi hat folgendes geschrieben: | Die Referenzzähler von Interfaces werden von Delphi intern automatisch verwaltet, somit sollten alle Interfaces aus deiner Funktion freigegeben werden, sobald diese fertig ist.
Möglicherweise liegt das Problem woanders..? |
Vermutlich in schrottiger Implementierung auf MS-Seite. Ich habe z.B. im IE (TWebBrowser) schon oft erlebt das dieser einfach Objekte hinter Interfacezeigern nicht freigibt auch wenn auf Delphi-Seite alles OK ist. Mein Code ist deshalb mit ein paar _Releases ergänzt worden (für IE 7 ein paar) weniger um die Speicherlücken auf der "Gegenseite" zu beheben.
|
|
Bergmann89 
      
Beiträge: 1742
Erhaltene Danke: 72
Win7 x64, Ubuntu 11.10
Delphi 7 Personal, Lazarus/FPC 2.2.4, C, C++, C# (Visual Studio 2010), PHP, Java (Netbeans, Eclipse)
|
Verfasst: Mo 25.02.08 21:47
HI,
@olliterski:
hab ma n testproject geschrieben, in dem ist bloß
der timer und ne StringList/ListBox!
Delphi-Quelltext 1: 2: 3: 4:
| procedure TForm1.Timer1Timer(Sender: TObject); begin GetWMIString('','WIN32_Pocessor','Caption',StringList) end; |
Die Speicherauslastung steigt aber immer noch! Also liegt
das nich an mir/meinem Prog!
@Bernhard Geyer:
Was meinst du mit _Releases?! bzw wie geht das?
Wäre toll, wenn das mein Problem löst!
MfG Bergmann
|
|
Gahero
      
Beiträge: 193
Win Vista HP 64bit
Delphi 2007 Pro
|
Verfasst: Mo 25.02.08 22:20
Genau das gleiche Problem habe ich auch. Es scheint aber an dieser Prozedur zu liegen, da es bei sämtlichen Aufrufen vorkommt...
Hatte das schonmal gepostet, vllt gibts ja jetzt enldich mal ne Lösung!
|
|
hathor
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Mo 25.02.08 23:15
Mit WMI die CPUlast auszulesen ist nicht sehr sinnvoll, mach es besser mit adcpuusage:
www.delphi-forum.de/...rch.php?mode=results
|
|
olliterski
      
Beiträge: 105
Erhaltene Danke: 2
Win7 64-Bit
D7 Ent.
|
Verfasst: Di 26.02.08 21:36
Bergmann89 hat folgendes geschrieben: | HI,
@olliterski:
...Die Speicherauslastung steigt aber immer noch! Also liegt
das nich an mir/meinem Prog!
|
....doch es liegt an deinem Prog! Genauer gesagt am Zugriff auf WMI!
Google war wie immer mein Freund und mein Freund meinte IDEübergreifend, dass es sich schlichtweg um ein Memoryleak handelt! ;o)
_________________ Viele Grüße
Oliver
|
|
QS07
Hält's aus hier
Beiträge: 4
WinXP Prof, WinXP Home, Win2k, Liniux Ubunto
Visual Basic, Object Pascal
|
Verfasst: Do 28.02.08 21:12
HI,
hab das gleiche Problem, hab aber auch noch keine
Lösung gefunden! Wäre toll wenn da jmd ne idee hat!
MfG QS
|
|
Bernhard Geyer
      
Beiträge: 721
Erhaltene Danke: 3
|
Verfasst: Fr 29.02.08 22:20
Bergmann89 hat folgendes geschrieben: | @Bernhard Geyer:
Was meinst du mit _Releases?! bzw wie geht das?
Wäre toll, wenn das mein Problem löst! |
Die fehlenden Freigaben werden wohl in der GetWMIstring-Implementierung sein.
|
|
Bergmann89 
      
Beiträge: 1742
Erhaltene Danke: 72
Win7 x64, Ubuntu 11.10
Delphi 7 Personal, Lazarus/FPC 2.2.4, C, C++, C# (Visual Studio 2010), PHP, Java (Netbeans, Eclipse)
|
Verfasst: Sa 01.03.08 16:36
Delphi-Quelltext 1: 2: 3: 4:
| class function CoSWbemLocator.Create: ISWbemLocator; begin Result := CreateComObject(CLASS_SWbemLocator) as ISWbemLocator; end; |
so wird das erzeugt, aber sowas wie DestroyComObj gibts eben nich, oder doch?!
MfG Bergmann.
|
|
|