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.