Проблема с периодической работой с Chart

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

Проблема с периодической работой с Chart

Сообщение Вадимку » 17.01.2008 12:28:37

В программе на Lazarus 0.9.24 fpc 2.2.0 для отображения постоянно меняющейся информации использую компонент chart. Там рисую 24 линейых графика. Затруднение у меня такое: перерисовывать графики приходится каждую секунду, и при каждой перерисовке объём выделенной моей программе памяти возрастает на 270 кбайт (ОС winXP SP2). После двух часов работы программы система кричит, что виртуальная память кончилась и закрывает мою программу.
Создаю графики (то есть в терминологии компонента chart - Series) так:

Код: Выделить всё
var
  n_can: integer;
  diagr: array [0..48] of TSerie;

for n_can:=0 to 23 do
  begin
  diagr[n_can]:= TSerie.Create(form1.Chart1);
  diagr[n_can].ShowLines := true;
  diagr[n_can].ShowPoints := false;
  diagr[n_can].ShowInLegend:=false;
  end;

А рисование происходит в такой процедуре:

Код: Выделить всё
procedure DemChart();
var
  n_i, n_can: integer;
begin
  form1.Chart1.Series.Clear;
  for n_can:=0 to 23 do
    begin
    diagr[n_can].clear;
    for n_i:=1 to N_izm-2 do
      diagr[n_can].AddXY(LKLVal[n_i],FDVal[n_can,n_i], IntToStr(n_can), Color(n_can));
    form1.Chart1.AddSerie(diagr[n_can]);
    end;
end;


Где LKLVal[n_i] - массив значений по координате X (общий для всех графиков), а FDVal[n_can,n_i] - массив значений по координате Y для каждого из графиков.

Что я делаю не так? Как мне добиться, чтобы память очищалась? form1.chart1.series.Free; и for n_can:=0 to NCH-1 do diagr[n_can].free; успехом не увенчались - первая же попытка отрисовки графиков после очистки памяти приводит к ошибке.

Модератор: учимся правильно оформлять сообщения
Вадимку
незнакомец
 
Сообщения: 2
Зарегистрирован: 17.01.2008 12:02:26
Откуда: Воронеж

Сообщение Rainmage » 17.01.2008 18:17:35

Столкнулся с тем же глюком. :)
Насколько я сумел разобраться, проблема где-то в методе Clear или глубже. Lazarus думает, что высвободил память, а на самом деле Windows (у меня тоже XP sp2) продолжает считать эту область занятой.
Пока приходиться делать так: применяю AddXY только для первой прорисовки, в дальнейшем, в каждом цикле просто меняю значения параметров уже существующих объектов (точек графика) и обновляю. Работает.
Но это всё паллиативы. Надо искать корень - почему возникает глюк с высвобождением памяти?
Rainmage
незнакомец
 
Сообщения: 1
Зарегистрирован: 17.01.2008 17:25:06

Сообщение Вадимку » 17.01.2008 18:28:23

Rainmage писал(а):Пока приходиться делать так: применяю AddXY только для первой прорисовки, в дальнейшем, в каждом цикле просто меняю значения параметров уже существующих объектов (точек графика) и обновляю. Работает.

Как ты это делаешь? Какими свойствами или процедурами?

Rainmage писал(а):Но это всё паллиативы. Надо искать корень - почему возникает глюк с высвобождением памяти?

:) Исходники есть - можно поискать. Если время будет.
Вадимку
незнакомец
 
Сообщения: 2
Зарегистрирован: 17.01.2008 12:02:26
Откуда: Воронеж

Сообщение Attid » 17.01.2008 22:22:24

Надо искать корень - почему возникает глюк с высвобождением памяти?

сделать тестовый пример и отправить в трекер, если выложишь тут, погоняю под линуксом, чтоб уточнить проблему.
Аватара пользователя
Attid
долгожитель
 
Сообщения: 2585
Зарегистрирован: 27.10.2006 17:29:15
Откуда: 44°32′23.63″N 41°2′25.2″E

Сообщение Gorjatschew » 20.01.2008 12:10:35

Не знаю, поможет или нет --- в своё время писал тестовый пример, где графики обновлялись каждую сегунду. Единственное, использовал не стандартный TChart, а сторонний TAGraph.
Код: Выделить всё
procedure TForm1.FormCreate(Sender: TObject);
begin
  Series0:=TTASerie.Create(TAChart1);
  TAChart1.AddSerie(Series0);
  Timer1.Enabled:=false;
end;

procedure TForm1.Timer1Timer(Sender: TObject);
var
  I: Integer;
begin
  Series0.Clear;
  Randomize;
  for I:=0 to 100 do
    Series0.AddXY(I, Random(I), clBlue);
end;
Аватара пользователя
Gorjatschew
новенький
 
Сообщения: 23
Зарегистрирован: 15.01.2008 18:57:06
Откуда: Санкт-Петербург

Сообщение Attid » 20.01.2008 12:29:31

стороний не канает, может что у него не того.

тестовый пример это зип(zip\tar.gz) архив распоковав который, можно скомпелировать на стандартном лазарусе без доп компонентов.
Аватара пользователя
Attid
долгожитель
 
Сообщения: 2585
Зарегистрирован: 27.10.2006 17:29:15
Откуда: 44°32′23.63″N 41°2′25.2″E


Вернуться в Lazarus

Кто сейчас на конференции

Сейчас этот форум просматривают: Yandex [Bot] и гости: 15

Рейтинг@Mail.ru