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

用TChart寫個即時監控圖表,卻ㄧ直吃掉記憶體

尚未結案
yuan1688
一般會員


發表:11
回覆:11
積分:4
註冊:2005-01-12

發送簡訊給我
#1 引用回覆 回覆 發表時間:2005-07-18 04:14:41 IP:59.104.xxx.xxx 未訂閱
各位先進,小弟遇上了麻煩事,用TChart寫個即時監控圖表,把最新ㄧ小時的狀態呈現,每分鐘refreshㄧ次,但再工作管理員內看到記憶體ㄧ直成長,到後來程式就掛了,已找出是下列這攤code的問題,請各位先進給我建言,謝謝 CThart.RemoveAllSeries ; TChart.SeriesList.Clear ; ADODataSetStat := TADODataSet.Create(nil); TChart.AddSeries(TLineSeries.Create(nil) ; TChart.Series[0].Title := '數量1; TChart.AddSeries(TLineSeries.Create(nil)) ; TChart.Series[1].Title := '數量2'; TChart.Legend.LegendStyle :=lsSeries; TChart.BottomAxis.Title.Caption :='minute'; TChart.LeftAxis.Title.Caption :='kbyte'; ADOCommand.CommandText := sqlstr ; ADODataSetStat.Recordset := ADOCommand.Execute ; while not ADODataSetStat.Eof do begin if ADODataSetStat.FieldValues['dir'] = 'in' then TChart.Series[0].Add(ADODataSetStat.FieldValues['aa'],ADODataSetStat.FieldValues['mmm']) ; if ADODataSetStat.FieldValues['dir'] = 'out' then chtRx.Series[1].Add(ADODataSetStat.FieldValues['bb],ADODataSetStat.FieldValues['mmm']) ; ADODataSetStat.Next ; end; ADODataSetStat.close ; FreeAndNil(ADODataSetStat);
Z12345
一般會員


發表:1
回覆:5
積分:6
註冊:2005-07-18

發送簡訊給我
#2 引用回覆 回覆 發表時間:2005-07-18 18:57:56 IP:219.81.xxx.xxx 未訂閱
試試這樣寫: Series1 :TLineSeries; ---------------------------------------- Series1 := TLineSeries.Create(nil); TChart.AddSeries(Series1) ; ------------------------------- FreeAndNil(Series1);
yuan1688
一般會員


發表:11
回覆:11
積分:4
註冊:2005-01-12

發送簡訊給我
#3 引用回覆 回覆 發表時間:2005-07-19 07:15:43 IP:59.104.xxx.xxx 未訂閱
這方法我試過,但好像沒什麼改善,非常感謝您的回答,我會改成你的方式持續測試..希望有可改善的方法出現...
Z12345
一般會員


發表:1
回覆:5
積分:6
註冊:2005-07-18

發送簡訊給我
#4 引用回覆 回覆 發表時間:2005-07-19 11:39:07 IP:219.81.xxx.xxx 未訂閱
資料部分試試這樣寫:    
private
   ADOConn :TADOCOnnection;
   ADOQry  :TADOQuery;
//---------------------------------
procedure TForm1.FormCreate(Sender: TObject);
begin
   ADOConn := TADOCOnnection.Create(nil);
   ADOCOnn.ConnectionString := 'Your connection string';
   ADOConn.LoginPrompt := false;
   ADOCOnn.Connected := true;       ADOQry := TADOQuery.Create(nil);
   ADOQry.Connection := ADOCOnn;
end;         //--------------------------------------
 with ADOQry Do
 begin
   Close;
   SQL.Text :=  sqlstr;
   Open;
   While Not Eof do
   begin
      //Do some thing .............          Next;
   end;
  
          //-----------------------------------------        procedure TfmrtMain.FormClose(Sender: TObject; var Action:     TCloseAction);
begin
   FreeAndNil(ADOQry);
   FreeAndNil(ADOConn);
end;    
發表人 - z12345 於 2005/07/19 12:07:20
yuan1688
一般會員


發表:11
回覆:11
積分:4
註冊:2005-01-12

發送簡訊給我
#5 引用回覆 回覆 發表時間:2005-07-19 14:43:04 IP:60.248.xxx.xxx 未訂閱
我馬上試,但我想說的是上頭在freeandnil(Series1)的時候,TCHART的內容會消失,謝謝.
Z12345
一般會員


發表:1
回覆:5
積分:6
註冊:2005-07-18

發送簡訊給我
#6 引用回覆 回覆 發表時間:2005-07-19 18:01:30 IP:219.81.xxx.xxx 未訂閱
換個方式 在FormCreate 時 Create Series; 在FormClose 時 Free Series; 或是在Design Time 直接建立 Series; 在 Refresh 動作前 Series.Clear; 不要每次Refresh 都 Create new Series
jeff377
初階會員


發表:9
回覆:60
積分:33
註冊:2004-08-10

發送簡訊給我
#7 引用回覆 回覆 發表時間:2005-07-20 10:18:01 IP:61.66.xxx.xxx 未訂閱
此文刪除... 發表人 - jeff377 於 2005/07/20 10:28:25
jeff377
初階會員


發表:9
回覆:60
積分:33
註冊:2004-08-10

發送簡訊給我
#8 引用回覆 回覆 發表時間:2005-07-20 10:19:38 IP:61.66.xxx.xxx 未訂閱
TChar的RemoveAllSeries只有移除Chart上的Series,並未將其Free;而TChart的SeriesList.Clear只是將TList的成員移除,也未將Series本身Free掉。所以你一直在建立TLineSeries會導致記憶體一直成長。    可以自行撰寫一函數,Free掉目前Chart中的所有Series即可,如下列的FreeChartSeries函數。    
procedure TForm1.FreeChartSeries(Chart: TChart);
var
  N1: Integer;
  Series: TChartSeries;
begin
  for N1:= Chart.SeriesList.Count-1 downto 0 do
  begin
    Series:= Chart.SeriesList.Series[N1];
    FreeAndNil(Series);
  end;
  Chart.RemoveAllSeries;
  Chart.SeriesList.Clear;
end;
而你原始程式碼中的前二行
  Chart.RemoveAllSeries ;
  Chart.SeriesList.Clear ;
改成
  FreeChartSeries(Chart);
即可正確的Free掉記憶體 發表人 - jeff377 於 2005/07/20 10:38:46
yuan1688
一般會員


發表:11
回覆:11
積分:4
註冊:2005-01-12

發送簡訊給我
#9 引用回覆 回覆 發表時間:2005-07-25 10:51:48 IP:60.248.xxx.xxx 未訂閱
非常感謝兩位的幫忙,實際上測試時Z12345兄的方式可減少記憶體增加的量,謝謝..
系統時間:2024-11-23 8:10:30
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!