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

VCL 元件如何釋放記憶體

尚未結案
dannynice
一般會員


發表:12
回覆:19
積分:6
註冊:2003-07-25

發送簡訊給我
#1 引用回覆 回覆 發表時間:2004-10-12 17:50:20 IP:211.75.xxx.xxx 未訂閱
請教各位先進 小弟在FROM上放了一個ListBox元件做為接收HTTP資料狀態,每收到一筆就記錄一列資料,如果滿一千筆就ListBox.Clear; 可是在觀看程式的記憶體使用情況,記憶會一直上升,最後會出現虛擬記憶太低而程式運作很慢,不知要如何以在清除ListBox的資料時也可以釋放記憶體 謝謝各位前輩
wameng
版主


發表:31
回覆:1336
積分:1188
註冊:2004-09-16

發送簡訊給我
#2 引用回覆 回覆 發表時間:2004-10-12 17:58:47 IP:61.222.xxx.xxx 未訂閱
應該不是 ListBox 的問題。 可能您建立了什麼..... 卻忘了釋放! 建議您使用 MemProof 工具,檢查一下。 就能知道 哪一個東西 沒釋放掉!
dannynice
一般會員


發表:12
回覆:19
積分:6
註冊:2003-07-25

發送簡訊給我
#3 引用回覆 回覆 發表時間:2004-10-12 18:39:03 IP:211.75.xxx.xxx 未訂閱
wameng 大大您好 請問一下 MemProof 這是什麼工具那裏可以找到 還有小弟只是將收到的值加入ListBox中並沒有建立其他的物件,比如說連接資料庫重複讀資料加入ListBox,每次讀取時先清除ListBox中的資料,利用廻圈讀取每一筆記錄加入ListBox中,再關閉資料庫的連接就會出現記憶體一直上升 使用元件如下 ADOConnection->ADODataSet->DataSetProvider->ClientDataSet procedure TMainFrm.Button1Click(Sender: TObject); begin ListBox.Clear; ADOConnection.Connected := True; ADODataSet.CommandText='select * from test'; ADODataSet.open; ClientDataSet.open; ADODataSet.close; ADOConnection.Connected := False; if(ClientDataSet.RecordCount>0)then begin ClientDataSet.First; while not ClientDataSet.Eof do begin ListBox.items.add(ClientDataSet.fieldvalue['Test1'] #9 ClientDataSet.fieldvalue['Test2'] #9 ClientDataSet.fieldvalue['Test3']); ClientDataSet.Next; end; end; ClientDataSet.close; end; 資料庫中的資料大約1600筆,如果重覆按 Button1 觀察記憶體變化就會一直上昇,不知是何原因 謝謉大大
wameng
版主


發表:31
回覆:1336
積分:1188
註冊:2004-09-16

發送簡訊給我
#4 引用回覆 回覆 發表時間:2004-10-12 19:01:39 IP:61.222.xxx.xxx 未訂閱
有可能是 ClientDataSet 的 Catch 沒清除掉的關係。 至於 memproof 工具 可以到 http://www.automatedqa.com/downloads/memproof.asp 下載。 發表人 - wameng 於 2004/10/12 19:04:48
dannynice
一般會員


發表:12
回覆:19
積分:6
註冊:2003-07-25

發送簡訊給我
#5 引用回覆 回覆 發表時間:2004-10-12 19:34:52 IP:211.75.xxx.xxx 未訂閱
wameng 大大您好 如果是ClientDataSet 的 Catch 那要如何才可以釋放 還有要如何觀看MemProof 這支程式可以知道是什麼物件造成記憶體的問題 當我執行時只看到Resource Counters ole sysstring 後面的數字一直在跑,可是不知如何看出問題在那裏 有沒有使用方法可以提供謝謝
wameng
版主


發表:31
回覆:1336
積分:1188
註冊:2004-09-16

發送簡訊給我
#6 引用回覆 回覆 發表時間:2004-10-12 20:27:42 IP:61.222.xxx.xxx 未訂閱
可能需要您自行 Trace 一下。 照道理 ClientDataSet.close; 就會將 Catch 清除。 我沒輒了! 您可以先遮蔽一些程式碼測試 並察看 MemProof 狀態。在足步找到原因。
John Wong
初階會員


發表:1
回覆:35
積分:32
註冊:2004-09-18

發送簡訊給我
#7 引用回覆 回覆 發表時間:2004-10-12 21:06:07 IP:203.218.xxx.xxx 未訂閱
試試把 ClientDataSet.open; 改為 ClientDataSet.CreateDataSet;
dannynice
一般會員


發表:12
回覆:19
積分:6
註冊:2003-07-25

發送簡訊給我
#8 引用回覆 回覆 發表時間:2004-10-13 14:24:34 IP:211.75.xxx.xxx 未訂閱
wameng 大大您好 不知那裏可以找到 MemProof 的help 謝謝 John Wong 大大您好 如果使用 ClientDataSet.CreateDataSet; 會出現 no fields defined cannot creat dataset 還有小弟有試過以下方式記憶體是正常的 procedure TMainFrm.Button1Click(Sender: TObject); begin ListBox.Clear; ADOConnection.Connected := True; ADODataSet.CommandText='select * from test'; ADODataSet.open; ClientDataSet.open; ADODataSet.close; ADOConnection.Connected := False; if(ClientDataSet.RecordCount>0)then begin ClientDataSet.First; while not ClientDataSet.Eof do begin ClientDataSet.Next; end; end; ClientDataSet.close; end; 在廻圈中不加任何動作記憶體釋放是正常的,可是只要加了listbox.items.add('....');記憶體就不斷的上昇就算清除ListBox也一樣 可是如果不使用 ClientDataSet 元件,直接在ListBox中加入資料然後清除就可釋放記憶體,所以真不知是那裏沒有釋放掉 不知跟 DataSetProvider 元件有沒有釋放誋憶體有關係,如果有那DataSetProvider要怎麼釋放記憶體 謝謝 大大的指導
wameng
版主


發表:31
回覆:1336
積分:1188
註冊:2004-09-16

發送簡訊給我
#9 引用回覆 回覆 發表時間:2004-10-13 17:40:45 IP:61.222.xxx.xxx 未訂閱
MemProof 應該不用 HELP 吧! 很簡單看的。透過 MemProof 去Run您的程式。 會發現各種指針及記憶體(最大、目前)....的運作情形。 當將程序關閉後,MemProof 會列出沒有釋放掉的資源。 在足步修正程式碼。 >加了listbox.items.add('....');記憶體就不斷的上昇 這是正常的。主要注意是,當Clear 後再 Items.add 是否還是記憶體就上升
系統時間:2024-05-17 11:34:59
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!