Форум программистов, компьютерный форум, киберфорум
Delphi: FireMonkey
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.77/13: Рейтинг темы: голосов - 13, средняя оценка - 4.77
0 / 0 / 0
Регистрация: 12.02.2014
Сообщений: 35
1

TChart или утечка памяти?

08.09.2014, 23:28. Показов 2320. Ответов 3
Метки нет (Все метки)

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

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

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
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;
В таймере добавляю для теста значения
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
  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;
И в добавок
Delphi
1
2
const
  Sec = 1 / (24 * 60 * 60);

Вроде бы все даже и работает. Но заметил одну не очень хорошую особенность (собственно почему и решил удалять значения). Что в менеджере процессов приложение понемножечку растет в оперативной памяти. Если отключаю таймер - все замерает на месте. За минут 5 набирается примерно 500 КБ.. вроде бы и не так много, но что-то надо делать. А а вдруг люди будут весь день с программой работать и что тогда? Посоветуйте что поправить! Использую Delphi XE6 Fire Monkey
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
08.09.2014, 23:28
Ответы с готовыми решениями:

Утечка памяти
Есть ли в Delphi 6 встроенные глюки, из-за которых может возникать утечка памяти? Конкретно...

Утечка памяти в WaitForMultipleObjects
Добрый день Возникла проблема при вызове WaitForMultipleObjects. Каждый раз при ее вызове...

Утечка, или как оптимизировать программу?
Есть небольшая программа для определения активного окна юзера и внесения в базу данных с...

Утечка памяти (или что-то еще)
Всем привет! Подскажите, пожалуйста, такой момент. Есть главная активность, на ней - 1 картинка....

3
10231 / 6609 / 498
Регистрация: 28.12.2010
Сообщений: 21,156
Записей в блоге: 1
09.09.2014, 10:29 2
не очень хорошую особенность (собственно почему и решил удалять значения). Что в менеджере процессов приложение понемножечку растет в оперативной памяти
аж странно да, накапливать значения в контейнере series и удивляться при этом почему кушает память. Оно ведь, если даже смещать визуализацию никуда не исчезнет, оно тут, в памяти и храниться и накапливается и это не утечка в обычном понимании, так вы сами делаете.

При больших объемах данных следует "хранить" в памяти именно тот кусок данных, который требуется для визуализации, а все остальное писать в файл, если хотите избежать бесконечного отжирания оперативной памяти и сохранения скорости работы. Создайте фиксированный буфер на 30 секунд и отображайте его со смещением и удалением точек, самое простое. Если пользователю понадобится осуществить навигацию с целью визуализации за пределы выбранного интервала, подгружайте из файла нужный накопленный участок.

Почитайте с поста #5 https://www.cyberforum.ru/post6331793.html и до конца.
0
0 / 0 / 0
Регистрация: 12.02.2014
Сообщений: 35
09.09.2014, 12:50  [ТС] 3
Тогда вопрос. Почему тогда в VCL все нормально работает? И почему тогда если после например 5 минут работы удалить все Serieses и Chart память не освобождается? (причем в отладчике видно что все Serieses и Chart = nil)
0
10231 / 6609 / 498
Регистрация: 28.12.2010
Сообщений: 21,156
Записей в блоге: 1
09.09.2014, 13:41 4
Почему тогда в VCL все нормально работает?
да ну Не имеет значения в FireMonkey или в VCL работаете, память будет отжираться и там и там.

И почему тогда если после например 5 минут работы удалить все Serieses и Chart память не освобождается?
во-первых - нам не видно как вы это делаете, во-вторых - TChart не предназначен для хранения нескольких миллионов точек, да любой модуль для этого не предназначен. И в-третьих - не смотрите под отладчиком, смотреть надо в релизе.

Это маразм пихать миллионы точек, которые просто не видны пользователю вследствие ограниченного разрешения монитора в контейнер. Одно дело тысячу-две отображать, другое - сотни тысяч и миллионы.
0
09.09.2014, 13:41
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
09.09.2014, 13:41
Помогаю со студенческими работами здесь

Утечка памяти или куда пропало =)
Люди всем привет :) Почему у меня после выполнения кода в a = '' ?, когда a = 'Z', a = 'A'O_o...

удаляется ли объект или происходит утечка памяти?
Добрый день, подскажите, при таком коде, удаляется ли объект или происходит утечка памяти? ...

Утечка памяти или что? Валидность итератора
вообщем падает задача через раз, вроде бы в 44 строке, вместо str+= надо бы по идее метод...

Утечка памяти в программе , как избежать или как правильно уничтожить объект?
Ребят помогите создал класс , вызываю его Creat после destroy ,проект работает только вот память...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru