IMHO.WS

IMHO.WS (https://www.imho.ws/index.php)
-   Программирование (https://www.imho.ws/forumdisplay.php?f=40)
-   -   TeeChart Pro v7 Оптимизация работы (https://www.imho.ws/showthread.php?t=77438)

Felan 12.01.2005 12:09

TeeChart Pro v7 Оптимизация работы
 
Пишу программу для работы с внешним устройством. Надо строить графики принимаемых сигналов.
Использую TLineSeries, плюс несколько курсоров (TCursorTool), для того, чтобы отмечать граници и получать данные по точкам. Сдалал скользящее окно и два скроллбара (вертикальный и горизонтальный). Сроллбары свои, т.к. родные как-то не так работали, вобщем, мне не понравилось, я сделал посвоему, хотя за основу взят код из примере. так что он отличается только пересчетом позиции бегунка.
Проблема в том, что читаются только первые 10-15 тысяч точек. Потом Программа начиает резко тормазить и виснет совсем. Точнее не виснет, а отказывается реагировать на действия пользователя.

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

Что еще можно покрутить? Может кто что посоветует? Отказаться от TeeChart предлогать только в том случае, если есть что-то действительно замечательное, ибо слишком много одобных вещей в ней.

dyr_farot 12.01.2005 16:09

кто ж 250000 точек рисует? и нафига
точки пихаеш в массив
потом интерполируеш их на заданом промежутке и их выводиш ( при разрешении 1024*768 по X-оси придется показать максимум 1024 точки )

Felan 13.01.2005 09:34

Цитата:

кто ж 250000 точек рисует? и нафига точки пихаеш в массив потом интерполируеш их на заданом промежутке и их выводиш ( при разрешении 1024*768 по X-оси придется показать максимум 1024 точки )
Это понятно. Дело в том, что никакой интерполяции нет. Вообще нет никакой обработки в реальном времени! Только скроллинг окна + небольшшие сервесные процедуры... Да, забыл, серия у меня подправленная немного, там в методе доабавления точки еще одна операция сложения есть. Но это все фигня, я думаю.

Точки я пихаю не в массив, а прямо в серию... есть там такой метод специальный...

Собственно говоря, твои слова подали мне одну идею... Но что ты хотел сказать я так и не понял. Т.е. как это можно применить в моем случае.
Если не трудно, поясни поподробнее.

А! Я кажется понял! Если в окне больше, чем 1024 точки, то получается, что в любом случае они обрабатываются, для того, чтобы убрать лишнее...

dyr_farot 13.01.2005 14:17

[quoteДело в том, что никакой интерполяции нет.[/quote]
в этом то и дело.

Цитата:

А! Я кажется понял! Если в окне больше, чем 1024 точки, то получается, что в любом случае они обрабатываются, для того, чтобы убрать лишнее...
и делается это ( вполне возможно ) не самыми эффективными методами

а делать можно двумя способами ( в зависимости от задач ):
1-й ( если нужно показать все точки ) -- точки просто интерполируются ( считай рисунок 250000*"хз сколько" _ужимается_ в 1024*768 ) ( это если все точки получаются в один момент ) если точки идут последовательно -- немного по-другому считать
2-й ( нужно показать точки _текущего момента_ ) в этом случае по твоим точкам двигается кадр 1024*768 и отображаются только точки, попавшие в кадр.

т.е. для дальнейшего разговора нужно уточнение задачи

Felan 13.01.2005 17:22

Вобщем-то идея и так вполне понятна!

Есть окно 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;

Вот собственно и весь код, который относится к добавлению и проресовке... Все остальное делается автоматически... :(

dyr_farot 13.01.2005 17:27

можеш сделать так:
( простейший вариант )
при получении новой точки добавлять ее не в Chart, а в массив ( предварительно удалив первую и потом ( очистив chart ) дать ему все эти точки

Felan 27.01.2005 10:06

Все оказалось несколько проще. Выловил пару глюков в функции чтения из порта, и немного изменил настройки MSСomm32. В итоге, работае хоть до полумиллиона точек... правда график не так плавно движется, но это терпимо.


Часовой пояс GMT +4, время: 17:52.

Powered by vBulletin® Version 3.8.5
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.