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!