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;

解决方案 »

  1.   


      lds_wql := TWmiQuery.Create(nil);
      lds_sql := TCustomOraQuery.Create(nil);
    改为全局的,不要每次都创建、释放如果别的都排除了,也可能它们的创建、释放其实并没有完整释放
      

  2.   

    回5楼:试过了,结果是一样的。
    回6楼:仔细检查过,没什么逻辑错误啊;至于加载DLL,我根本就没有手工加载过。