线程中,多次adoquery添加数据后内存不断增长 |
答題得分者是:P.D.
|
sunsmooth
一般會員 發表:1 回覆:1 積分:0 註冊:2007-04-14 發送簡訊給我 |
在线程中,使用动态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 發送簡訊給我 |
不是很懂您這支程式的真正目的, 但就寫作上幾項重點, 這樣的寫法肯定效能好不到那裡
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 發送簡訊給我 |
|
P.D.
版主 發表:603 回覆:4038 積分:3874 註冊:2006-10-31 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |