首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > .NET >

services application timer 内存只增不减,该如何解决

2012-05-16 
services application timer 内存只增不减timer事件中查询并更新相关数据,使用了TOraQuery,ToraSession,TW

services application timer 内存只增不减
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;

[解决办法]
有办法可以解决 可能注意很馊 但绝对管用 代码全部干掉
下面的要喷我了!!!!遮住脸先





=====================================================================================


看别人的程式,增长自己知识!


=====================================================================================
[解决办法]

lds_wql := TWmiQuery.Create(nil);
lds_sql := TCustomOraQuery.Create(nil);
改为全局的,不要每次都创建、释放

如果别的都排除了,也可能它们的创建、释放其实并没有完整释放
[解决办法]
可能情况:
1)代码中有可疑代码为“逻辑”错误的
2)加载多余的DLL资源,没有正确释放

热点排行