| imho.ws |
![]() |
|
|
|
# 1 |
|
Junior Member
Регистрация: 19.05.2003
Адрес: Самара
Сообщения: 52
![]() |
TeeChart Pro v7 Оптимизация работы
Пишу программу для работы с внешним устройством. Надо строить графики принимаемых сигналов.
Использую TLineSeries, плюс несколько курсоров (TCursorTool), для того, чтобы отмечать граници и получать данные по точкам. Сдалал скользящее окно и два скроллбара (вертикальный и горизонтальный). Сроллбары свои, т.к. родные как-то не так работали, вобщем, мне не понравилось, я сделал посвоему, хотя за основу взят код из примере. так что он отличается только пересчетом позиции бегунка. Проблема в том, что читаются только первые 10-15 тысяч точек. Потом Программа начиает резко тормазить и виснет совсем. Точнее не виснет, а отказывается реагировать на действия пользователя. Пробовал отключать на время сбора данных курсоры, таже ерунда. Если заполнять серию вручную, то строится до 25 тысяч точек, но очень долго тормазит. БОльшего чилса точек дождаться не удалось. Что еще можно покрутить? Может кто что посоветует? Отказаться от TeeChart предлогать только в том случае, если есть что-то действительно замечательное, ибо слишком много одобных вещей в ней.
__________________
Когда у оппонента кончаются аргументы, он начинает уточнять национальность. |
|
|
|
|
# 3 | |
|
Junior Member
Регистрация: 19.05.2003
Адрес: Самара
Сообщения: 52
![]() |
Цитата:
Точки я пихаю не в массив, а прямо в серию... есть там такой метод специальный... Собственно говоря, твои слова подали мне одну идею... Но что ты хотел сказать я так и не понял. Т.е. как это можно применить в моем случае. Если не трудно, поясни поподробнее. А! Я кажется понял! Если в окне больше, чем 1024 точки, то получается, что в любом случае они обрабатываются, для того, чтобы убрать лишнее...
__________________
Когда у оппонента кончаются аргументы, он начинает уточнять национальность. Последний раз редактировалось Felan; 13.01.2005 в 09:39. |
|
|
|
|
|
# 4 | |
|
Advanced Member
Регистрация: 23.08.2003
Сообщения: 442
![]() ![]() |
[quoteДело в том, что никакой интерполяции нет.[/quote]
в этом то и дело. Цитата:
а делать можно двумя способами ( в зависимости от задач ): 1-й ( если нужно показать все точки ) -- точки просто интерполируются ( считай рисунок 250000*"хз сколько" _ужимается_ в 1024*768 ) ( это если все точки получаются в один момент ) если точки идут последовательно -- немного по-другому считать 2-й ( нужно показать точки _текущего момента_ ) в этом случае по твоим точкам двигается кадр 1024*768 и отображаются только точки, попавшие в кадр. т.е. для дальнейшего разговора нужно уточнение задачи |
|
|
|
|
|
# 5 |
|
Junior Member
Регистрация: 19.05.2003
Адрес: Самара
Сообщения: 52
![]() |
Вобщем-то идея и так вполне понятна!
Есть окно 5000*300 (от-150 до 150). По вертикали все точки укладываются по определению. По горизонтале, когда новая поступившая точка выходит за пределы окна, оно сдвигается на 100 точек. Смущает мне тут только одно. Я сам точки не ресую. Когда с порта приходит отсчет, он просто дабавляется к серии ser.AddY(nn), а вся перересовка вывполняется самим компонентом TeeChart. На событии серии ser.onAfterAdd стоит проверка, выходит ли новая точка за экран, и если да, то окно сдвигается... Собственно сейчас код вылвожу! Код:
procedure TfrmDFS.MSCommComm(Sender: TObject);
//Событие при получении чего-нибудь в буфер порта
var
v:array of Byte;
f,nn:Integer;
begin
If Self.MSComm.InBufferCount>0 then
begin
SetLength(v,Self.MSComm.InputLen);
v:=Self.MSComm.Input;
For F:=0 to length(v)-1 do
Begin
If v[F]>127 then nn:=v[F]-256
else nn:=v[F];
Self.serCurrentSeries.AddY(nn); // Вот тут добавляем точки
End;
end;
end;
Код:
procedure TDefSeriesMng.OnSerTestAfterAdd(Sender: TChartSeries;
ValueIndex: Integer);
//Смещение окна, если график выходит за правую границу
begin
If Sender.GetHorizAxis.Maximum<Sender.XValues.MaxValue then
With Sender.GetHorizAxis do
Begin
maximum:=maximum+100;
minimum:=minimum+100;
end;
end;
__________________
Когда у оппонента кончаются аргументы, он начинает уточнять национальность. |
|
|
|
|
# 7 |
|
Junior Member
Регистрация: 19.05.2003
Адрес: Самара
Сообщения: 52
![]() |
Все оказалось несколько проще. Выловил пару глюков в функции чтения из порта, и немного изменил настройки MSСomm32. В итоге, работае хоть до полумиллиона точек... правда график не так плавно движется, но это терпимо.
__________________
Когда у оппонента кончаются аргументы, он начинает уточнять национальность. |
|
|