全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:2153
推到 Plurk!
推到 Facebook!

线程中,多次adoquery添加数据后内存不断增长

答題得分者是:P.D.
sunsmooth
一般會員


發表:1
回覆:1
積分:0
註冊:2007-04-14

發送簡訊給我
#1 引用回覆 回覆 發表時間:2007-12-14 12:46:02 IP:219.150.xxx.xxx 訂閱
在线程中,使用动态adoquery,循环添加数据,但内存不断增长,无法释放,帮忙看看,谢谢了!
以下为线程中的代码 :
[code delphi]
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) ' 个');
adduser(rurl);
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;
[/code]

P.D.
版主


發表:603
回覆:4038
積分:3874
註冊:2006-10-31

發送簡訊給我
#2 引用回覆 回覆 發表時間:2007-12-17 16:14:13 IP:61.67.xxx.xxx 未訂閱
不是很懂您這支程式的真正目的, 但就寫作上幾項重點, 這樣的寫法肯定效能好不到那裡
1.使用 select * ==> 一般都不建議這樣做, 雖然這與寫 select a,b,c,d 結果一樣, 但 * 的用法會造成SQL來還要多做一段解譯為A,B,C,D, 與其這樣不如先程式寫好, 了不起多佔個1K大小, 但也盡量避免select all field
2.在function中不斷create, 指定sql , open, relase , 造成系統不斷在記憶體中變動, 當然效能不好,
尤其是xp系統, 對 memory常為人詬病(其實自win95至今一向都如此)
最好的方式是把這些前置設定移到外面, 然後只要讓系統執行一次就好, 其他透過程式再處理
3.另外還有底下紅色的部份, where 1=2 這....看不懂唄
===================引 用 sunsmooth 文 章===================在线程中,使用动态adoquery,循环添加数据,但内存不断增长,无法释放,帮忙看看,谢谢了!
..... 略
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;
end;
end;

sunsmooth
一般會員


發表:1
回覆:1
積分:0
註冊:2007-04-14

發送簡訊給我
#3 引用回覆 回覆 發表時間:2007-12-19 11:40:07 IP:219.150.xxx.xxx 訂閱
谢谢版主热心回答,使用

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

好一些了。
P.D.
版主


發表:603
回覆:4038
積分:3874
註冊:2006-10-31

發送簡訊給我
#4 引用回覆 回覆 發表時間:2007-12-20 00:11:47 IP:60.249.xxx.xxx 未訂閱
當然囉, select 會造成 sql 回值結果, insert into 只將結果送回主機, 不再回傳值, 當然效能要好
系統時間:2024-05-02 21:17:50
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!