Загрузка ЦП и TChart.
Подробнее...
В программе есть несколько дочерних окон(6) с графиками(объектами TChart), в каждом по 60 серий. Графики автомасштабируются.
Когда точек становится несколько тысяч(конкретно 8000), то при интервале добавления в 10 секунд возникает ситуация, когда перерисовка графиков длится до добавления новых точек и ЦП загужен почти полностью.
Спасибо!
У вас отрисовка графиков вынесена в отдельный поток?
Цитата: Alexander92
У вас отрисовка графиков вынесена в отдельный поток?
Нет, в основном потоке.
Рекомендую вынести. Очень облегчает приложение. Если нужно - могу поделиться собственным примером на Delphi.
Я не представляю пока как это может быть реализовано. Буду очень благодарен если поделитесь!
http://sources.codenet.ru/download/3844/parabola_builder.html.
Построение параболы с использованием потоков.
2 Dmitryl
В сериях чарта храните только видимые в данный момент точки с учетом масштаба чарта. Остальное храните в каком-нибудь контейнере и отрисовывайте по необходимости
Нездешний, общая нагрузка не облегчится, но "тяжеловесность" приложения уйдет. А вместе с тем - можно будет наглядно смотреть, что можно еще подкорректировать. Или вы считаете, что Application.ProcessMessages() после каждой точки создает меньшую нагрузку?
Application->ProcessMessages() после каждой точки? Нафига?
VCL не многопоточная библиотека, работать с GUI из другого потока - это значит с помощью Synchronize прервать работу с GUI основного потока, переключить контекст на другой поток, сделать нужное (причем часть), опять переключить контекст обратно на основной поток, продолжить его выполнение и т.д., пока все нужное не выполнится. Где выгода?
Вместо 111111111111 при одном потоке получим 1|2|1|2|1|1|2|1|2|2|2|1, где 1 - операции основного потока, 2 - операции дополнительного потока, | - переключение контекстов и синхронизация
В отдельный поток выносят обычно не GUI, а, наоборот, длительные операции, которые могут этот GUI "подвесить". Если же тормозит сам GUI, вынесением в другой поток части работы с ним проблему ну никак не решить
Цитата: Alexander92
Построение параболы с использованием потоков.
Посмотрел. Простите, я ошибся когда написал "в основном". На самом деле отрисовка идет в отдельном одном потоке.
Цитата: Нездешний
В сериях чарта храните только видимые в данный момент точки с учетом масштаба чарта. Остальное храните в каком-нибудь контейнере и отрисовывайте по необходимости
Спасибо! Только вот вопрос: характер графика нельзя изменять и если каким-то образом из 8000 точек оставить например 200, то неизвестно изменится характер или нет.
А какая задача, в принципе? Что изображают ваши графики?
На графиках температура, точки добавляются через 10 сек, процесс может идти больше суток. Каждая точка обозначена(TFastLineSeries не подходит). Во всплывающей подсказке(при наведении на точку) показывается время и температура. Имеются режимы: автомасштабирование и самописец.
Есть еще вариант, но он пока не продуман, просто предлагаю общую идею. Существует множество путей аппроксимации экспериментальных данных некоторой функцией в явном виде. Может быть, возможно (особенно при большом количестве точек) аппроксимировать ваши точки некоторой кривой и отображать именно эту кривую (по гораздо меньшему количеству точек)? А потом, с появлением каждой следующей точки, проверять: если она укладывается на кривую, то продолжать в том же духе, а если нет - провести аппроксимацию еще раз (проверку можно сделать, например, по квадратичному отклонению). С увеличением количества точек потребность в повторной аппроксимации будет возникать все реже.
[ATTACH]4605[/ATTACH]
Ну согласитесь, что там достаточно много точек сливается. Попробуйте все-таки отображать их выборочно, исходя из расстояния между ними. Попробуйте добавлять следующую точку в Series только при условии, что она отстоит от предыдущей на некоторое "разумное" расстояние. С одной стороны, конечно, проверка - это дополнительная операция, а с другой - надо посмотреть, при каком выбранном расстоянии между точками задержка на нее окупится.
TChart вообще не самый быстрый компонент. Для этой задачи, возможно, проще будет написать собственную рисовалку, чем воевать с TChart. Если есть аппроксимация -- до ручного отображения один шаг.
Цитата: Freeman
Для этой задачи, возможно, проще будет написать собственную рисовалку, чем воевать с TChart.
Может и придется написать.
Цитата: Freeman
TChart вообще не самый быстрый компонент. Для этой задачи, возможно, проще будет написать собственную рисовалку, чем воевать с TChart. Если есть аппроксимация -- до ручного отображения один шаг.
Ну не знаю, у меня TChart используется в спектральном
анализаторе звука в реальном масштабе времени и работает,
не тормозит, еще и звук воспроизводить успеваю. Правда точек вывожу до 8 тысяч, потом Series1->Clear() и заново.