用TChart寫個即時監控圖表,卻ㄧ直吃掉記憶體 |
尚未結案
|
yuan1688
一般會員 發表:11 回覆:11 積分:4 註冊:2005-01-12 發送簡訊給我 |
各位先進,小弟遇上了麻煩事,用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 發送簡訊給我 |
|
yuan1688
一般會員 發表:11 回覆:11 積分:4 註冊:2005-01-12 發送簡訊給我 |
|
Z12345
一般會員 發表:1 回覆:5 積分:6 註冊:2005-07-18 發送簡訊給我 |
資料部分試試這樣寫:
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 發送簡訊給我 |
|
Z12345
一般會員 發表:1 回覆:5 積分:6 註冊:2005-07-18 發送簡訊給我 |
|
jeff377
初階會員 發表:9 回覆:60 積分:33 註冊:2004-08-10 發送簡訊給我 |
|
jeff377
初階會員 發表:9 回覆:60 積分:33 註冊:2004-08-10 發送簡訊給我 |
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 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |