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

StringGrid的持續寫入造成程式記憶體使用量不斷增加

答題得分者是:daldal
jinliang1979g
一般會員


發表:1
回覆:0
積分:0
註冊:2005-01-28

發送簡訊給我
#1 引用回覆 回覆 發表時間:2008-06-04 02:49:07 IP:122.120.xxx.xxx 訂閱
大家好,
如標題, StringGrid的持續寫入造成程式記憶體使用量不斷增加
不知道該如何消除此問題,每次增加的記憶體大小不同 約10~20k,
請各位先進指點。
感激不進~~

附件有執行結果的畫面。




程式碼如下:
//---------------------------------------------------------------------------
#include
#pragma hdrstop
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
LoopCount = 0;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::ButtonStartLoopClick(TObject *Sender)
{
Timer1->Enabled = true;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::ButtonStopLoopClick(TObject *Sender)
{
Timer1->Enabled = false;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Timer1Timer(TObject *Sender)
{
LoopCount ;
Form1->StringGrid1->Cells[1][LoopCount] = Form1->LoopCount ;
Form1->StringGrid1->Cells[1][1]= Form1->LoopCount ;
}
//---------------------------------------------------------------------------
daldal
高階會員


發表:6
回覆:102
積分:226
註冊:2007-06-18

發送簡訊給我
#2 引用回覆 回覆 發表時間:2008-06-04 15:56:55 IP:220.130.xxx.xxx 未訂閱
因為這行的關係
[code cpp]
Form1->StringGrid1->Cells[1][LoopCount] = Form1->LoopCount ;
[/code]
雖然你的StringGrid1顯示出來的大小只有5x5
但是由於上面那行,你的StringGrid1動態大小一直在增長
你可以把再執行Timer後觀看以下Cells[x][y]的內容

[code cpp]
ShowMessage(StringGrid1->Cells[1][5]);
ShowMessage(StringGrid1->Cells[1][8]);
....類推

[/code]

其實都是有值的,只是不會顯示出來而已
自然會占用記憶體囉
ytzou
一般會員


發表:0
回覆:1
積分:0
註冊:2008-05-29

發送簡訊給我
#3 引用回覆 回覆 發表時間:2008-06-04 18:32:32 IP:61.61.xxx.xxx 訂閱

===================引 用 daldal 文 章===================
因為這行的關係
[code cpp]
Form1->StringGrid1->Cells[1][LoopCount] = Form1->LoopCount ;
[/code]
雖然你的StringGrid1顯示出來的大小只有5x5
但是由於上面那行,你的StringGrid1動態大小一直在增長
你可以把再執行Timer後觀看以下Cells[x][y]的內容
===================引 用 daldal 文 章===================


可是若固定行數,一直重複填入固定的行數,
記憶體還是會逐漸增加?
//---------------------------------------------------------------------------
#include
#pragma hdrstop
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
LoopCount = 0;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::ButtonStartLoopClick(TObject *Sender)
{
Timer1->Enabled = true;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::ButtonStopLoopClick(TObject *Sender)
{
Timer1->Enabled = false;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Timer1Timer(TObject *Sender)
{
LoopCount ;
int aa = LoopCount%5;
Form1->StringGrid1->Cells[1][aa] = Form1->LoopCount ;
//Form1->StringGrid1->Cells[1][1]= Form1->LoopCount ;
}
//---------------------------------------------------------------------------
編輯記錄
ytzou 重新編輯於 2008-06-04 18:34:04, 註解 無‧
daldal
高階會員


發表:6
回覆:102
積分:226
註冊:2007-06-18

發送簡訊給我
#4 引用回覆 回覆 發表時間:2008-06-04 19:55:11 IP:220.130.xxx.xxx 未訂閱
上面的程式碼並沒有發現異常
你可以不開Timer比較看看
兩者是差不多的
若硬是說有差別的話,大概是你的字串一直增長到很多位數的時候
兩者之間耗用的記憶體不一樣多產生的

例如
AnsiString p="";
AnsiString p="12127366273612736271632176327163712637212387128371287381273821";
兩者占用的Byte數當然不同囉
不過LoopCount變數應該會先爆掉吧
系統時間:2024-05-05 5:21:46
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!