下面例子是在线程中,循环100次,每次5个子线程写内容到数据库中,使用adoquery循环添加数据,但内存不断增长,无法释放,帮忙看看,谢谢了!对了,也试过动态创建ADOConnection,每个AdoQuery 对应一个ADOConnection,但结果一样,内存不断增长,不能释放。d7+Access
以下为例子中的代码 :function Tuser_reg_thread.adduser(r_url:string):boolean;
var
  ado_thread_user_reg:TADOQuery;
begin
  try
  ado_thread_user_reg:= TADOQuery.Create(nil);
  ado_thread_user_reg.Connection:=frm_main.ADOConnection1;
  try
  with ado_thread_user_reg do
  begin     
    close;
    sql.Clear;
    sql.Text:='select * from [url] where 1=2';
    open;
    append;
      fieldbyname('url').AsString:=r_url;
    post;
  end;   
  finally
  FreeAndNil(ado_thread_user_reg);
  end;
  result:=true;
  except
  result:=false;
  end;
end;
procedure Tuser_reg_thread.Execute;
var
  i: integer;
begin
try
  for i:=1 to rnum do
    begin         
    frm_main.ListBox1.Items.Add(rurl+' 第 '+inttostr(i)+' 个');
    cs.Enter;
    adduser(rurl);
    cs.Leave;
    end;           
finally
  sendmessage(frm_main.ListBox1.Handle,WM_VSCROLL,SB_BOTTOM,0);
end;
end;
//构造函数
constructor Tuser_reg_thread.create(url:string;num:integer);
begin
  FreeOnTerminate := true;
  rURL := url;
  rnum:=num;
  {构造完毕立刻执行}
  inherited Create(false);
end;destructor Tuser_reg_thread.Destroy;
begin
  WaitExecute;
  inherited;
end;procedure Tuser_reg_thread.WaitExecute;
begin
  Terminate;
  WaitFor;
end;   procedure Ttestthread.Execute;
var
  r_url:string;
  i: integer;
begin
try
  frm_main.ListBox1.Items.Add('开始');
  for i:=0 to 100 do
  begin
  r_url:='http'+inttostr(i);
  u_reg:= Tuser_reg_thread.Create(r_url,5);
  sleep(300);
  end;
except
  frm_main.ListBox1.Items.Add('出现未知错误');
end;
end;initialization 
 cs:=TCriticalSection.Create;  //初始化
finalization
 cs.Free; //删除

解决方案 »

  1.   

        close;
        sql.Clear;
        sql.Add('insert into url(url) values ('''+r_url+''')');
        execsql;
      

  2.   

    execsql一个INSERT语句 不用返回数据集
    还有
    如果ado_thread_user_reg.Connection:=frm_main.ADOConnection1;这句出现异常
    ado_thread_user_reg是释放不了的 应该finally 镶嵌except吧
      

  3.   

      线程初始化的时候,动态创建TADOCommand,退出线程释放ADOCommand实例对象。如果不断创建,不断释放,内存对象管理可能不一定立刻释放。
      另外,附带一句,你线程里使用了主线程(frm_main上的一些对象)里的一些对象,需要用Synchronize同步。
      

  4.   

    谢谢lynmison热心回答,TADOCommand是静态使用的,应该不存在创建释放内存的问题吧。至于同步,谢谢你的提醒。:)
      

  5.   

    多线程执行
        frm_main.ListBox1.Items.Add(rurl+' 第 '+inttostr(i)+' 个');
        cs.Enter;//可能失败,直接跳到finally后面,会引起无法预知问题
        adduser(rurl);
        cs.Leave;
      

  6.   

    这样在cs.Enter中创建的有些对象就无法释放一直占用内存