Перейти к содержанию
Fire Monkey от А до Я
  • 0

TChart ест память?


Nikitos

Вопрос

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

В таймере выполняю код:

  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;

Где

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

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

Ссылка на комментарий

Рекомендуемые сообщения

  • 0

Новые подробности. Переделал немного проект. Сейчас решил использовать 12 линий. За минут 5 уже более 1 Мб набегает. При этом самое странное, что если отключаю таймер и удаляю график (Chart1.Free), приложение в процессах не уменьшается. Ведь должна же освободиться память? Проект прикладываю. Проверил вчера еще прошлый пример на VCL, увеличение программы не заметил. Помогите пожайлуста, очень важно. Проект скоро показывать нужно, а тут такое.

FM Chart.zip

Ссылка на комментарий
  • 0
  • Администраторы

Запускаю ваш проект на XE7 под Widnows 64Bit. Рост памяти не вижу. Специально сделал частоту генерации данных, 10 раз в секунду. Прикладываю скриншоты анализа используемой памяти. Как видно на графиках, рост памяти не наблюдается на графике, постоянен и равен 33,4 Мб. 

post-1-0-44538300-1410527161_thumb.png

 

При удалении TeeChart все корректно происходит. Память занимаемая самим компонентом отдается менеджеру памяти Delphi, а не системе. А менеджер делфи будет держать ее у себя для новых ваших объектов. Поэтому вы не увидите на системном графике, что память отдана обратно приложением операционной системе. 

 

Ссылка на комментарий
Гость
Эта тема закрыта для публикации ответов.
  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу
×
×
  • Создать...