Hi,
ich möchte noch einmal auf das Thema Memory Leaks durch WMI Objekte kommen. Gibt es mittlerweile einen Workaround? Man schaue sich dazu folgendes Skript an:
Spoiler anzeigen
While 1
_OSSerialNumber()
Sleep(1000)
WEnd
Func _OSSerialNumber()
Local $objWMIService = ObjGet("winmgmts:{impersonationLevel=impersonate}!\\.\root\cimv2")
Local $colSettings = $objWMIService.ExecQuery ("Select SerialNumber from Win32_OperatingSystem")
For $objOperatingSystem In $colSettings
$objWMIService = 0
Return ($objOperatingSystem.SerialNumber & '"')
Next
EndFunc ;==>_OSSerialNumber
Die Zeile
[autoit]$objWMIService = 0
[/autoit]kann man sich auch sparen, bringt überhaupt nichts. Wenn man die AU3 nun kompiliert und laufen lässt, sieht man, dass sich der Speicherverbrauch kontinuierlich erhöht. Das ist natürlich völlig inakzeptabel und WMI ist so nicht für mich zu gebrauchen.
Liegt das Problem an WMI oder an AutoIt (fehlerhafte Implementierung der Object-Functions)?
Bin für jeden Vorschlag zu haben!
PS: Sehe anhand meines Beispiels, dass die Synatx hervorhebung für Objekt-Methoden nicht richtig ist, dass nur nebenbei!
EDIT: Habe auch folgendes probiert, aber auch kein Unterschied (Hätte ja sein können, das es am wiederholten Aufruf von ObjGet liegt, scheint aber mehr an den Queries zu liegen:
Spoiler anzeigen
main()
[/autoit] [autoit][/autoit] [autoit]Func OnAutoItStart()
Opt("MustDeclareVars", 1)
EndFunc ;==>OnAutoItStart
Func main()
Local $objWMIService = _WMIInit()
While 1
_OSSerialNumber($objWMIService)
Sleep(1000)
WEnd
EndFunc ;==>main
Func OnAutoItExit()
GUIDelete()
EndFunc ;==>OnAutoItExit
Func _OSSerialNumber(ByRef Const $objWMIService)
Local $colSettings = $objWMIService.ExecQuery ("Select SerialNumber from Win32_OperatingSystem")
For $objOperatingSystem In $colSettings
Return ($objOperatingSystem.SerialNumber & '"')
Next
EndFunc ;==>_OSSerialNumber
Func _WMIInit()
Return (ObjGet("winmgmts:{impersonationLevel=impersonate}!\\.\root\cimv2"))
EndFunc ;==>_WMIInit
Das nervt mich ab. Mann kann zwar dadurch Dinge einmalig abfragen (was ja auch oftmals reicht), wirklich dynamische Sachen sind so aber nicht durchführbar!