Einzelnen Beitrag anzeigen

Tod787

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

Timerfunktion: Arbeitsspeicher läuft voll

  Alt 30. Mai 2008, 11: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