Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Загрузка ЦП и TChart.

7.5K
19 января 2011 года
Dmitryl
55 / / 19.06.2007
Подскажите пожалуйста можно ли снизить загрузку ЦП при добавлении точек к сериям на графике?
Подробнее...
В программе есть несколько дочерних окон(6) с графиками(объектами TChart), в каждом по 60 серий. Графики автомасштабируются.
Когда точек становится несколько тысяч(конкретно 8000), то при интервале добавления в 10 секунд возникает ситуация, когда перерисовка графиков длится до добавления новых точек и ЦП загужен почти полностью.
Спасибо!
278
19 января 2011 года
Alexander92
1.1K / / 04.08.2008
У вас отрисовка графиков вынесена в отдельный поток?
7.5K
19 января 2011 года
Dmitryl
55 / / 19.06.2007
Цитата: Alexander92
У вас отрисовка графиков вынесена в отдельный поток?


Нет, в основном потоке.

278
19 января 2011 года
Alexander92
1.1K / / 04.08.2008
Рекомендую вынести. Очень облегчает приложение. Если нужно - могу поделиться собственным примером на Delphi.
7.5K
19 января 2011 года
Dmitryl
55 / / 19.06.2007
Я не представляю пока как это может быть реализовано. Буду очень благодарен если поделитесь!
278
19 января 2011 года
Alexander92
1.1K / / 04.08.2008
Вот, набросал быстренько:
http://sources.codenet.ru/download/3844/parabola_builder.html.
Построение параболы с использованием потоков.
535
19 января 2011 года
Нездешний
537 / / 17.01.2008
странно, как вынесение затратной операции в отдельный поток (т.е. вдобавок к тем операциям мы добавляем еще и переключение контекстов) должно облегчить загрузку процессора?

2 Dmitryl
В сериях чарта храните только видимые в данный момент точки с учетом масштаба чарта. Остальное храните в каком-нибудь контейнере и отрисовывайте по необходимости
278
19 января 2011 года
Alexander92
1.1K / / 04.08.2008
Нездешний, общая нагрузка не облегчится, но "тяжеловесность" приложения уйдет. А вместе с тем - можно будет наглядно смотреть, что можно еще подкорректировать. Или вы считаете, что Application.ProcessMessages() после каждой точки создает меньшую нагрузку?
535
19 января 2011 года
Нездешний
537 / / 17.01.2008
Что такое "тяжеловесность"?
Application->ProcessMessages() после каждой точки? Нафига?

VCL не многопоточная библиотека, работать с GUI из другого потока - это значит с помощью Synchronize прервать работу с GUI основного потока, переключить контекст на другой поток, сделать нужное (причем часть), опять переключить контекст обратно на основной поток, продолжить его выполнение и т.д., пока все нужное не выполнится. Где выгода?

Вместо 111111111111 при одном потоке получим 1|2|1|2|1|1|2|1|2|2|2|1, где 1 - операции основного потока, 2 - операции дополнительного потока, | - переключение контекстов и синхронизация

В отдельный поток выносят обычно не GUI, а, наоборот, длительные операции, которые могут этот GUI "подвесить". Если же тормозит сам GUI, вынесением в другой поток части работы с ним проблему ну никак не решить
7.5K
21 января 2011 года
Dmitryl
55 / / 19.06.2007
Цитата: Alexander92

Построение параболы с использованием потоков.


Посмотрел. Простите, я ошибся когда написал "в основном". На самом деле отрисовка идет в отдельном одном потоке.

Цитата: Нездешний

В сериях чарта храните только видимые в данный момент точки с учетом масштаба чарта. Остальное храните в каком-нибудь контейнере и отрисовывайте по необходимости


Спасибо! Только вот вопрос: характер графика нельзя изменять и если каким-то образом из 8000 точек оставить например 200, то неизвестно изменится характер или нет.

278
21 января 2011 года
Alexander92
1.1K / / 04.08.2008
А какая задача, в принципе? Что изображают ваши графики?
7.5K
24 января 2011 года
Dmitryl
55 / / 19.06.2007
На графиках температура, точки добавляются через 10 сек, процесс может идти больше суток. Каждая точка обозначена(TFastLineSeries не подходит). Во всплывающей подсказке(при наведении на точку) показывается время и температура. Имеются режимы: автомасштабирование и самописец.
278
24 января 2011 года
Alexander92
1.1K / / 04.08.2008
Понял. Скажите, а неужели все 8000 точек отображаются раздельно? Мне кажется, что они все-таки сливаются в единую кривую при таком их количестве. А в таком случае целесообразно отображать не все точки, а только те, расстояние между которыми различимо для человеческого глаза, т.е. хотя бы пару пикселей.

Есть еще вариант, но он пока не продуман, просто предлагаю общую идею. Существует множество путей аппроксимации экспериментальных данных некоторой функцией в явном виде. Может быть, возможно (особенно при большом количестве точек) аппроксимировать ваши точки некоторой кривой и отображать именно эту кривую (по гораздо меньшему количеству точек)? А потом, с появлением каждой следующей точки, проверять: если она укладывается на кривую, то продолжать в том же духе, а если нет - провести аппроксимацию еще раз (проверку можно сделать, например, по квадратичному отклонению). С увеличением количества точек потребность в повторной аппроксимации будет возникать все реже.
7.5K
24 января 2011 года
Dmitryl
55 / / 19.06.2007
Выглядит так:
[ATTACH]4605[/ATTACH]
278
24 января 2011 года
Alexander92
1.1K / / 04.08.2008
Ну согласитесь, что там достаточно много точек сливается. Попробуйте все-таки отображать их выборочно, исходя из расстояния между ними. Попробуйте добавлять следующую точку в Series только при условии, что она отстоит от предыдущей на некоторое "разумное" расстояние. С одной стороны, конечно, проверка - это дополнительная операция, а с другой - надо посмотреть, при каком выбранном расстоянии между точками задержка на нее окупится.
10
24 января 2011 года
Freeman
3.2K / / 06.03.2004
TChart вообще не самый быстрый компонент. Для этой задачи, возможно, проще будет написать собственную рисовалку, чем воевать с TChart. Если есть аппроксимация -- до ручного отображения один шаг.
7.5K
25 января 2011 года
Dmitryl
55 / / 19.06.2007
Сделал так: выбрал 180 точек, как оптимальное число даже при самом большом масштабе. Нахожу такой делитель числа точек, чтобы отношение было 180, округляю делитель. Полученое число есть приращение индекса точки при перерисовке графика. В итоге на графике всегда примерно 180 точек. Чем больше реальное число точек, тем ближе к 180 число точек на графике. Загрузка существенно снизилась.
Цитата: Freeman
Для этой задачи, возможно, проще будет написать собственную рисовалку, чем воевать с TChart.


Может и придется написать.

1.9K
01 февраля 2011 года
George22
91 / / 09.12.2007
Цитата: Freeman
TChart вообще не самый быстрый компонент. Для этой задачи, возможно, проще будет написать собственную рисовалку, чем воевать с TChart. Если есть аппроксимация -- до ручного отображения один шаг.



Ну не знаю, у меня TChart используется в спектральном
анализаторе звука в реальном масштабе времени и работает,
не тормозит, еще и звук воспроизводить успеваю. Правда точек вывожу до 8 тысяч, потом Series1->Clear() и заново.

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог