Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > TChart ест память?


Автор: krik 4.9.2014, 12:46
Всем привет. Столкнулся с задачкой, чтобы вывести значения работы двигателя. Необходимо показывать значения за последние 30 секунд. На ум пришло решение положить TChart на форму и по таймеру с интервалом в 1 секунду добавлять значения в график. 

При создании формы проинициализировал основные параметры
Код

Chart1.View3D := false;
Chart1.AnimatedZoom := false;
Chart1.ScaleLastPage := true;
Chart1.Zoomed := false;
Chart1.AnimatedZoomSteps := 4;
Chart1.MaxPointsPerPage := 30;
Chart1.BottomAxis.Increment := DateTimeStep[ dtFiveSeconds ];
Chart1.BottomAxis.LabelsMultiLine := true;
Chart1.BottomAxis.DateTimeFormat := 'dd/mm/yy hh:mm:ss';
Chart1.BottomAxis.ExactDateTime := true;
Chart1.Series[0].XValues.DateTime := true;
Chart1.Series[1].XValues.DateTime := true;
Chart1.Series[2].XValues.DateTime := true;
Chart1.Series[3].XValues.DateTime := true;
Chart1.Series[4].XValues.DateTime := true;
Chart1.Series[5].XValues.DateTime := true;
Chart1.Series[6].XValues.DateTime := true;


В таймере добавляю для теста значения
Код

  Chart1.Series[0].AddXY(now,random(100));
  Chart1.Series[1].AddXY(now,random(50));
  Chart1.Series[2].AddXY(now,random(120));
  Chart1.Series[3].AddXY(now,random(75));
  Chart1.Series[4].AddXY(now,random(102));
  Chart1.Series[5].AddXY(now,random(100));
  Chart1.Series[6].AddXY(now,random(250));

  if Chart1.Series[0].XValues.Count > 30 then 
    begin         

      Chart1.BottomAxis.Maximum := Chart1.Series[0].MaxXValue + Sec;
      Chart1.BottomAxis.Minimum := Chart1.BottomAxis.Minimum + Sec;

      Chart1.Series[0].XValues.Delete(Chart1.Series[0].XValues.Count-31);
      Chart1.Series[0].YValues.Delete(Chart1.Series[0].YValues.Count-31);
      Chart1.Series[1].XValues.Delete(Chart1.Series[1].XValues.Count-31);
      Chart1.Series[1].YValues.Delete(Chart1.Series[1].YValues.Count-31);
      Chart1.Series[2].XValues.Delete(Chart1.Series[2].XValues.Count-31);
      Chart1.Series[2].YValues.Delete(Chart1.Series[2].YValues.Count-31);
      Chart1.Series[3].XValues.Delete(Chart1.Series[3].XValues.Count-31);
      Chart1.Series[3].YValues.Delete(Chart1.Series[3].YValues.Count-31);
      Chart1.Series[4].XValues.Delete(Chart1.Series[4].XValues.Count-31);
      Chart1.Series[4].YValues.Delete(Chart1.Series[4].YValues.Count-31);
      Chart1.Series[5].XValues.Delete(Chart1.Series[5].XValues.Count-31);
      Chart1.Series[5].YValues.Delete(Chart1.Series[5].YValues.Count-31);
      Chart1.Series[6].XValues.Delete(Chart1.Series[6].XValues.Count-31);
      Chart1.Series[6].YValues.Delete(Chart1.Series[6].YValues.Count-31);  
    end;


И в добавок 
Код

const
  Sec = 1 / (24 * 60 * 60);


Вроде бы все даже и работает. Но заметил одну не очень хорошую особенность (собственно почему и решил удалять значения). Что в менеджере процессов приложение понемножечку растет в оперативной памяти. Если отключаю таймер - все замерает на месте. За минут 5 набирается примерно 500 КБ.. вроде бы и не так много, но что-то надо делать. А а вдруг люди будут весь день с программой работать и что тогда? Посоветуйте что поправить! Использую Delphi XE6 Fire Monkey

Автор: krik 4.9.2014, 14:21
Что-то совсем не пойму... Отключил добавление элементов.. Проверил что будет если просто понажимать на кнопки.. и пришел к выводу что походу буду делать проект на VCL а не Fire Monkey. Получилось что память увиличивается когда просто на кнопки нажимаешь.... Может я чего не понимаю?  smile  Плюс в VCL exe файл в 10 раз меньше и при нажимании на кнопки вообще ничего не увиличивается. Может кто сталкивался?

Автор: drkot 4.9.2014, 15:02
не "добавлять" а пере присваивать значения.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)