timer事件中查询并更新相关数据,使用了TOraQuery,ToraSession,TWmiConnection,TWmiQuery个人觉得该释放的对象都已释放,但是内存一直增长。
请高手赐教,谢谢。
timer每秒钟执行一次。procedure TCOLSYS.getprocess;
var
lds_wql:TWmiQuery;
lds_sql:TCustomOraQuery;
i,li_handle:integer;
ls_muse : string;
label last;
begin
lds_wql := TWmiQuery.Create(nil);
lds_sql := TCustomOraQuery.Create(nil);
if not iniquery(lds_sql,'select * from process where cid='''+is_computerid+'''') then goto last;
if not iniwql(lds_wql,'select name,processid,parentprocessid,ExecutablePath,threadcount,workingsetsize,handle FROM win32_process') then
goto last;
if not delsql(lds_wql,'handle',lds_sql,'phandle') then goto last;
for i:=0 to lds_wql.RecordCount - 1 do
begin
li_handle := getitemnumber(lds_wql,'handle');
if not find_data(lds_sql,'phandle',li_handle) then
begin
lds_sql.Append;
lds_sql.Edit;
setitemstring(lds_sql,'id',newid());
setitemstring(lds_sql,'cid',is_computerid);
setitemnumber(lds_sql,'phandle',li_handle);
end;
lds_sql.Edit;
if getitemstring(lds_sql,'pname') <> getitemstring(lds_wql,'name') then
setitemstring(lds_sql,'pname',getitemstring(lds_wql,'name'));
if getitemstring(lds_sql,'path') <> getitemstring(lds_wql,'ExecutablePath') then
setitemstring(lds_sql,'path',getitemstring(lds_wql,'ExecutablePath'));
ls_muse := byte2tb(getitemnumber(lds_wql,'workingsetsize'));
if getitemstring(lds_sql,'muse') <> ls_muse then setitemstring(lds_sql,'muse',ls_muse);
if getitemnumber(lds_sql,'processid') <> getitemnumber(lds_wql,'processid') then
setitemnumber(lds_sql,'processid',getitemnumber(lds_wql,'processid'));
if getitemnumber(lds_sql,'parentprocessid') <> getitemnumber(lds_wql,'parentprocessid') then
setitemnumber(lds_sql,'parentprocessid',getitemnumber(lds_wql,'parentprocessid'));
if getitemnumber(lds_sql,'threadcount') <> getitemnumber(lds_wql,'threadcount') then
setitemnumber(lds_sql,'threadcount',getitemnumber(lds_wql,'threadcount'));
lds_wql.Next;
end;
savedata(lds_sql);
last:
freeandnil(lds_wql);
freeandnil(lds_sql);
end;procedure TCOLSYS.Timer1Timer(Sender: TObject);
begin
if ib_timing then exit;
ib_timing := true;
getprocess;
ib_timing := false;
end;
请高手赐教,谢谢。
timer每秒钟执行一次。procedure TCOLSYS.getprocess;
var
lds_wql:TWmiQuery;
lds_sql:TCustomOraQuery;
i,li_handle:integer;
ls_muse : string;
label last;
begin
lds_wql := TWmiQuery.Create(nil);
lds_sql := TCustomOraQuery.Create(nil);
if not iniquery(lds_sql,'select * from process where cid='''+is_computerid+'''') then goto last;
if not iniwql(lds_wql,'select name,processid,parentprocessid,ExecutablePath,threadcount,workingsetsize,handle FROM win32_process') then
goto last;
if not delsql(lds_wql,'handle',lds_sql,'phandle') then goto last;
for i:=0 to lds_wql.RecordCount - 1 do
begin
li_handle := getitemnumber(lds_wql,'handle');
if not find_data(lds_sql,'phandle',li_handle) then
begin
lds_sql.Append;
lds_sql.Edit;
setitemstring(lds_sql,'id',newid());
setitemstring(lds_sql,'cid',is_computerid);
setitemnumber(lds_sql,'phandle',li_handle);
end;
lds_sql.Edit;
if getitemstring(lds_sql,'pname') <> getitemstring(lds_wql,'name') then
setitemstring(lds_sql,'pname',getitemstring(lds_wql,'name'));
if getitemstring(lds_sql,'path') <> getitemstring(lds_wql,'ExecutablePath') then
setitemstring(lds_sql,'path',getitemstring(lds_wql,'ExecutablePath'));
ls_muse := byte2tb(getitemnumber(lds_wql,'workingsetsize'));
if getitemstring(lds_sql,'muse') <> ls_muse then setitemstring(lds_sql,'muse',ls_muse);
if getitemnumber(lds_sql,'processid') <> getitemnumber(lds_wql,'processid') then
setitemnumber(lds_sql,'processid',getitemnumber(lds_wql,'processid'));
if getitemnumber(lds_sql,'parentprocessid') <> getitemnumber(lds_wql,'parentprocessid') then
setitemnumber(lds_sql,'parentprocessid',getitemnumber(lds_wql,'parentprocessid'));
if getitemnumber(lds_sql,'threadcount') <> getitemnumber(lds_wql,'threadcount') then
setitemnumber(lds_sql,'threadcount',getitemnumber(lds_wql,'threadcount'));
lds_wql.Next;
end;
savedata(lds_sql);
last:
freeandnil(lds_wql);
freeandnil(lds_sql);
end;procedure TCOLSYS.Timer1Timer(Sender: TObject);
begin
if ib_timing then exit;
ib_timing := true;
getprocess;
ib_timing := false;
end;
lds_wql := TWmiQuery.Create(nil);
lds_sql := TCustomOraQuery.Create(nil);
改为全局的,不要每次都创建、释放如果别的都排除了,也可能它们的创建、释放其实并没有完整释放
回6楼:仔细检查过,没什么逻辑错误啊;至于加载DLL,我根本就没有手工加载过。