![]() |
Timerfunktion: Arbeitsspeicher läuft voll
Es geht um ein Programm in dem stätig abgefragt wird ob die Netzwerkkarten mit einem Medium verbunden sind oder nicht.
Gelöst habe ich dies mit einer Timer-Prozedur in der Zustand der Karten abgefragt wird. Das Problem ist nun, dass jetzt mit jedem Zyklus ein weiteres Object erstellt wird und demnach langsam aber sicher der RAM vollläuft.
Delphi-Quellcode:
Habe zwar hier aus dem Forum den Tipp bekommen aber leider komme ich da nicht weiter und den User gibts scheinbar nicht mehr.
procedure TForm1.Timer1Timer(Sender: TObject);
var wmi : variant; wmiService : variant; nicstatus : variant; card : Olevariant; cnt : integer; Enum: IEnumVariant; P : IUnknown; F : Cardinal; connected : integer; status : string; begin ListBox1.clear; WMI:=CreateOleObject('WbemScripting.SWbemLocator'); wmiService := wmi.ConnectServer('.', 'root\wmi'); nicstatus := wmiService.InstancesOf('MSNdis_MediaConnectStatus'); p := nicstatus._NewEnum; p.QueryInterface(IEnumVariant, Enum); for cnt := 0 to nicstatus.Count - 1 do begin Enum.Next(1, card, F); connected := card.NdisMediaConnectStatus; if (connected = 0) then begin Status := 'verbunden'; end else begin Status := 'nicht verbunden'; end; ListBox1.Items.Add( card.InstanceName + ' : ' + status); end; end; Zitat:
|
Re: Timerfunktion: Arbeitsspeicher läuft voll
Und was ist an der Aussage unklar?
|
Re: Timerfunktion: Arbeitsspeicher läuft voll
Objekte aus Com-Servern gibt man frei, in dem man sie auf nil setzt.
|
Re: Timerfunktion: Arbeitsspeicher läuft voll
Mein Problem ist, dass ich noch nicht genau weiß wie ich das anstellen soll. Vielleicht kann mir das ja jemand von euch erklären oder das Zurücksetzen eben einfach in den Code oben einbauen.
|
Re: Timerfunktion: Arbeitsspeicher läuft voll
Schreib mal als letzte Zeile
Delphi-Quellcode:
. IIRC ging das bei OLE/COM auf diese Art.
WMI := Unassigned;
|
Re: Timerfunktion: Arbeitsspeicher läuft voll
Delphi-Quellcode:
wirkt leider nicht (habs an das Ende der For-Schleife gelegt und beim 2. Versuch danach).
WMI := Unassigned;
Bei
Delphi-Quellcode:
bekomm ich die Fehlermeldung
WMI:=NIL
Zitat:
|
Re: Timerfunktion: Arbeitsspeicher läuft voll
Hi,
evtl. Null? Keine Ahnung, nur so geraten. Mfg FAlter |
Re: Timerfunktion: Arbeitsspeicher läuft voll
Dann mach doch WMI zu einer globalen Variablen, initialisiere sie im initialization-Abschnitt und gib sie im finalization-Abschnitt wieder frei.
|
Re: Timerfunktion: Arbeitsspeicher läuft voll
Probier mal das...
Delphi-Quellcode:
procedure TForm1.Timer1Timer(Sender: TObject);
var wmi : OleVariant; // <---- wmiService : variant; nicstatus : Olevariant; // <---- card : Olevariant; cnt : integer; Enum: IEnumVariant; P : IUnknown; F : Cardinal; connected : integer; status : string; begin ListBox1.clear; WMI:=CreateOleObject('WbemScripting.SWbemLocator'); try // <---- wmiService := wmi.ConnectServer('.', 'root\wmi'); nicstatus := wmiService.InstancesOf('MSNdis_MediaConnectStatus'); try // <---- p := nicstatus._NewEnum; p.QueryInterface(IEnumVariant, Enum); for cnt := 0 to nicstatus.Count - 1 do begin Enum.Next(1, card, F); try connected := card.NdisMediaConnectStatus; if (connected = 0) then begin Status := 'verbunden'; end else begin Status := 'nicht verbunden'; end; ListBox1.Items.Add( card.InstanceName + ' : ' + status); finally card := unassigned; end; end; finally // <---- nicstatus := unassigned; // <---- end; // <---- finally // <---- wmi := unassigned; // <---- end; // <---- end; Edit: Hab es gerade mal ausprobiert, bei mir bleibt der Arbeitsspeicher stabil. |
Re: Timerfunktion: Arbeitsspeicher läuft voll
Funktioniert sogar sehr gut :)
Kann aber alles noch nicht ganz nachvollziehen. Jedenfalls hast du mit den Try-Finally-Blöcken im Fehlerfall sämtliche Systemressourcen freigegeben. Werde mir das übers WE nochmal zu Gemüte führen und dann hoffentlich ein wenig mehr durchblicken. In jedem Fall danke für die schnelle Hilfe. Schönes WE! |
Alle Zeitangaben in WEZ +1. Es ist jetzt 03:38 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