AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Timerfunktion: Arbeitsspeicher läuft voll

Ein Thema von Tod787 · begonnen am 30. Mai 2008 · letzter Beitrag vom 30. Mai 2008
Antwort Antwort
Tod787

Registriert seit: 19. Mai 2008
99 Beiträge
 
#1

Timerfunktion: Arbeitsspeicher läuft voll

  Alt 30. Mai 2008, 12:29
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:
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;
Habe zwar hier aus dem Forum den Tipp bekommen aber leider komme ich da nicht weiter und den User gibts scheinbar nicht mehr.

Zitat:
Er schrieb folgendes:

Du instanziierst mit
Delphi-Quellcode: markieren
WMI:=CreateOleObject('WbemScripting.SWbemLocator') ;


innerhalb eines Timer ein Objekt; logisch, dass irgendwann der Speicher vollläuft, wenn Du das Objekt nicht wieder zerstörst!

Du hast nun zwei Möglichkeiten:
1.
Du erzeugst die Objektinstanz außerhalb des Timers, und damit nur ein einziges Mal (z.B. beim Erzeugen der Form) und greifst im Timer auf dieses Objekt zu. Beim Zerstören der Form gibst Du das Objekt wieder frei.

2.
Du erzeugst das Objekt wie bisher im Timer, gibst es aber auch dort wieder frei.

Ich weiß nicht genau, was Dein Code tun soll, daher weiß ich nicht, was für Dich das Richtige ist.
Intuitiv würde ich allerdings zu Alternative #1 tendieren.
Der Code sonst funktioniert eigentlich sehr gut.
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.624 Beiträge
 
Delphi 12 Athens
 
#2

Re: Timerfunktion: Arbeitsspeicher läuft voll

  Alt 30. Mai 2008, 12:33
Und was ist an der Aussage unklar?
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

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

Re: Timerfunktion: Arbeitsspeicher läuft voll

  Alt 30. Mai 2008, 12:34
Objekte aus Com-Servern gibt man frei, in dem man sie auf nil setzt.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Tod787

Registriert seit: 19. Mai 2008
99 Beiträge
 
#4

Re: Timerfunktion: Arbeitsspeicher läuft voll

  Alt 30. Mai 2008, 13:14
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.
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.624 Beiträge
 
Delphi 12 Athens
 
#5

Re: Timerfunktion: Arbeitsspeicher läuft voll

  Alt 30. Mai 2008, 13:18
Schreib mal als letzte ZeileWMI := Unassigned; . IIRC ging das bei OLE/COM auf diese Art.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Tod787

Registriert seit: 19. Mai 2008
99 Beiträge
 
#6

Re: Timerfunktion: Arbeitsspeicher läuft voll

  Alt 30. Mai 2008, 13:42
WMI := Unassigned; wirkt leider nicht (habs an das Ende der For-Schleife gelegt und beim 2. Versuch danach).

Bei WMI:=NIL bekomm ich die Fehlermeldung
Zitat:
[Pascal Fehler] Unit1.pas(86): E2010 Inkompatible Typen: 'Variant' und 'Pointer'
Der Arbeitsspeicher nimmt weiterhin mit jedem Zyklus stetig zu
  Mit Zitat antworten Zitat
Benutzerbild von FAlter
FAlter

Registriert seit: 21. Jul 2004
Ort: Ostfildern
1.096 Beiträge
 
FreePascal / Lazarus
 
#7

Re: Timerfunktion: Arbeitsspeicher läuft voll

  Alt 30. Mai 2008, 13:43
Hi,

evtl. Null?

Keine Ahnung, nur so geraten.

Mfg
FAlter
Felix Alter
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.624 Beiträge
 
Delphi 12 Athens
 
#8

Re: Timerfunktion: Arbeitsspeicher läuft voll

  Alt 30. Mai 2008, 13:44
Dann mach doch WMI zu einer globalen Variablen, initialisiere sie im initialization-Abschnitt und gib sie im finalization-Abschnitt wieder frei.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Tyrael Y.

Registriert seit: 28. Jul 2003
Ort: Stuttgart
1.093 Beiträge
 
Delphi 2007 Professional
 
#9

Re: Timerfunktion: Arbeitsspeicher läuft voll

  Alt 30. Mai 2008, 14:09
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.
Levent Yildirim
Erzeugung von Icons aus Bildern:IconLev
  Mit Zitat antworten Zitat
Tod787

Registriert seit: 19. Mai 2008
99 Beiträge
 
#10

Re: Timerfunktion: Arbeitsspeicher läuft voll

  Alt 30. Mai 2008, 14:56
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!
  Mit Zitat antworten Zitat
Antwort Antwort


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 16:03 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