![]() |
TeeChart Pro v7 Оптимизация работы
Пишу программу для работы с внешним устройством. Надо строить графики принимаемых сигналов.
Использую TLineSeries, плюс несколько курсоров (TCursorTool), для того, чтобы отмечать граници и получать данные по точкам. Сдалал скользящее окно и два скроллбара (вертикальный и горизонтальный). Сроллбары свои, т.к. родные как-то не так работали, вобщем, мне не понравилось, я сделал посвоему, хотя за основу взят код из примере. так что он отличается только пересчетом позиции бегунка. Проблема в том, что читаются только первые 10-15 тысяч точек. Потом Программа начиает резко тормазить и виснет совсем. Точнее не виснет, а отказывается реагировать на действия пользователя. Пробовал отключать на время сбора данных курсоры, таже ерунда. Если заполнять серию вручную, то строится до 25 тысяч точек, но очень долго тормазит. БОльшего чилса точек дождаться не удалось. Что еще можно покрутить? Может кто что посоветует? Отказаться от TeeChart предлогать только в том случае, если есть что-то действительно замечательное, ибо слишком много одобных вещей в ней. |
кто ж 250000 точек рисует? и нафига
точки пихаеш в массив потом интерполируеш их на заданом промежутке и их выводиш ( при разрешении 1024*768 по X-оси придется показать максимум 1024 точки ) |
Цитата:
Точки я пихаю не в массив, а прямо в серию... есть там такой метод специальный... Собственно говоря, твои слова подали мне одну идею... Но что ты хотел сказать я так и не понял. Т.е. как это можно применить в моем случае. Если не трудно, поясни поподробнее. А! Я кажется понял! Если в окне больше, чем 1024 точки, то получается, что в любом случае они обрабатываются, для того, чтобы убрать лишнее... |
[quoteДело в том, что никакой интерполяции нет.[/quote]
в этом то и дело. Цитата:
а делать можно двумя способами ( в зависимости от задач ): 1-й ( если нужно показать все точки ) -- точки просто интерполируются ( считай рисунок 250000*"хз сколько" _ужимается_ в 1024*768 ) ( это если все точки получаются в один момент ) если точки идут последовательно -- немного по-другому считать 2-й ( нужно показать точки _текущего момента_ ) в этом случае по твоим точкам двигается кадр 1024*768 и отображаются только точки, попавшие в кадр. т.е. для дальнейшего разговора нужно уточнение задачи |
Вобщем-то идея и так вполне понятна!
Есть окно 5000*300 (от-150 до 150). По вертикали все точки укладываются по определению. По горизонтале, когда новая поступившая точка выходит за пределы окна, оно сдвигается на 100 точек. Смущает мне тут только одно. Я сам точки не ресую. Когда с порта приходит отсчет, он просто дабавляется к серии ser.AddY(nn), а вся перересовка вывполняется самим компонентом TeeChart. На событии серии ser.onAfterAdd стоит проверка, выходит ли новая точка за экран, и если да, то окно сдвигается... Собственно сейчас код вылвожу! Код:
procedure TfrmDFS.MSCommComm(Sender: TObject);Код:
procedure TDefSeriesMng.OnSerTestAfterAdd(Sender: TChartSeries; |
можеш сделать так:
( простейший вариант ) при получении новой точки добавлять ее не в Chart, а в массив ( предварительно удалив первую и потом ( очистив chart ) дать ему все эти точки |
Все оказалось несколько проще. Выловил пару глюков в функции чтения из порта, и немного изменил настройки MSСomm32. В итоге, работае хоть до полумиллиона точек... правда график не так плавно движется, но это терпимо.
|
| Часовой пояс GMT +4, время: 00:58. |
Powered by vBulletin® Version 3.8.5
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.