Práce s COM - leakuje RAM – Delphi – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Práce s COM - leakuje RAM – Delphi – Fórum – Programujte.comPráce s COM - leakuje RAM – Delphi – Fórum – Programujte.com

 

Vlákno bylo úspěšně vloženo.
Pokud sám přijdeš na řešení, nezapomeň ho sem přidat!
pan Hole
~ Anonymní uživatel
16 příspěvků
20. 6. 2016   #1
-
0
-

Dobrý den,

mám program Open Hardware Monitor, který ukládá informace o hardwaru do WMI (Windows Management Instrumentation). Napsal jsem program, který je z WMI tahá ven a přes USB posílá na LCD displej. Problém je, že tu část kódu, která se stará a přístup do WMI, jsem našel na netu a strašlivě mi leakuje RAM, což je u programu, který má běžet pořád, celkem záasadní věc... Po cca třech hodinách ten program zabírá 1 GB RAM. Nevidíte někde na první pohled něco, co by chtělo uvolnit nebo dealokovat?

Funkce:

function GetWMIstring(wmiHost, root, wmiClass, wmiProperty, co: string): string;
var
  objWMIService : OLEVariant;
  colItems      : OLEVariant;
  colItem       : OLEVariant;
  oEnum         : IEnumvariant;
  iValue        : LongWord;

  function GetWMIObject(const objectName: String): IDispatch;
  var
    chEaten: Integer;
    BindCtx: IBindCtx;//for access to a bind context
    Moniker: IMoniker;//Enables you to use a moniker object
  begin
    OleCheck(CreateBindCtx(0, bindCtx));
    OleCheck(MkParseDisplayName(BindCtx, StringToOleStr(objectName), chEaten, Moniker));//Converts a string into a moniker that identifies the object named by the string
    OleCheck(Moniker.BindToObject(BindCtx, nil, IDispatch, Result));//Binds to the specified object

  end;


begin
  objWMIService := GetWMIObject(Format('winmgmts:\\%s\%s',[wmiHost,root]));
  colItems      := objWMIService.ExecQuery(Format(co,[wmiClass]),'WQL',0);
  oEnum         := IUnknown(colItems._NewEnum) as IEnumVariant;
  while oEnum.Next(1, colItem, iValue) = 0 do
  begin
     Result:=colItem.Properties_.Item(wmiProperty, 0); //you can improve this code  ;) , storing the results in an TString.
  end;

end;


Volání:

 try                        // Prikon CPU
    CoInitialize(nil);
    try

      str := (GetWMIstring('.', 'root\OpenHardwareMonitor', 'Sensor','Value', 'SELECT * FROM Sensor WHERE INSTANCEID = "3860"'));
      pos := ansipos(',', str);
      if pos>0 then final := copy(str, 1, pos-1)   else final:=str;
      Label1.Caption :=final;
      ven:=final;

 finally
    CoUninitialize;
    end;
 except
    on E:Exception do
    Begin
        Writeln(E.Classname, ': ', E.Message);
        Readln;
    End;
  end;

P.S.: druhá část kódu, která to udesílá přes USB je v pohodě, když jsem jednotlivé části zakomentoval, tak jsem zjistil, že to dělá ta, která tahá informace z WMI.

Díky za tipy!

Nahlásit jako SPAM
IP: 84.16.103.–
KIIV
~ Moderátor
+43
God of flame
20. 6. 2016   #2
-
0
-
Nahlásit jako SPAM
IP: 94.113.93.–
Program vždy dělá to co naprogramujete, ne to co chcete...
pan Hole
~ Anonymní uživatel
16 příspěvků
21. 6. 2016   #3
-
0
-

#2 KIIV
Hluboká, hluboká, HLUBOKÁ poklona! Vaše lama se plazí v prachu, čumák má až u země! To je přesně ten jeden řádek, který to spravil. Děkuji!

Nahlásit jako SPAM
IP: 84.16.103.–
KIIV
~ Moderátor
+43
God of flame
21. 6. 2016   #4
-
0
-

#3 pan Hole
mne dekovat nemusis, podekuj googlu :D Ja to jen nechal vyhledat

Nahlásit jako SPAM
IP: 212.47.3.–
Program vždy dělá to co naprogramujete, ne to co chcete...
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 3 hosté

Podobná vlákna

RAM — založil Peťan

C++ a RAM... — založil Mega.Lama

RAM... — založil Mega.Lama

Externí RAM — založil yaqwsx

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý