Модераторы: Poseidon, Snowy, bems, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> работа с chart ом, формирование исходных данных 
:(
    Опции темы
СЭНСЭЙ
Дата 2.5.2009, 17:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 432
Регистрация: 20.3.2006

Репутация: нет
Всего: нет



Такая задача
Вы программе регулярно выгружатся данные в буфер с периодичностью около секунды. Размер данных до 1000 значение типа real. Нужно что бы chart отображал несколько последних выгрузок, к примеру 600 (10 минут). Я пробовал создать динамический массив на 1000*600 значений типа real и каждую выгрузку сначала в цикле смещать значения внутри массива влево, а затем в конец массива дописывать значения из буфера, а потом очищать chart и вновь заполнять его массивом.
На практике этот способ оказался слишком медленным.
Подскажите пожалуйста алгоритм порациональней

PM MAIL   Вверх
kami
Дата 3.5.2009, 00:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1806
Регистрация: 25.8.2007
Где: Санкт-Петербург

Репутация: 23
Всего: 72



Цитата(СЭНСЭЙ @  2.5.2009,  17:36 Найти цитируемый пост)
сначала в цикле смещать значения внутри массива влево, а затем в конец массива дописывать значения из буфера

Насколько медленно? Код смещения в студию.
По идее, он должен укладываться в одну команду:
Код

Move(ValueArray[x], ValueArray[0], (Length(ValueArray)-x)*SizeOf(ValueArray[0]));

Стандартная ф-я Move обладает хорошей производительностью, но если и ее нехватает, можно воспользоваться заменителями с FastCode.
Можно и CopyMemory. На закуску для экзотики - CopyArray.

Если массив двумерный, могу порекомендовать TList.
Логика проста:
каждый элемент TList - это динамический одномерный массив (т.е. выборка).
При добавлении очередной выборки последовательность следующая:

Код

tmpArray:=myList[0];
SetLength(tmpArray, 0);
myList.Delete(0);
myList.Add(NewArray);


Хотя, я бы советовал не заниматься постоянным удалением/добавлением данных в кучу.
Лучше воспользоваться уже использованными участками памяти:

Код

tmpArray:=myList[0];
myList.Delete(0); // убрали массив из общего списка
GetMyChartData(tmpArray); // заполнили новыми данными, возможно - с переопределением размерности
myList.Add(tmpArray); // опять добавили, но уже в конец.

PM MAIL WWW   Вверх
СЭНСЭЙ
Дата 3.5.2009, 11:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 432
Регистрация: 20.3.2006

Репутация: нет
Всего: нет



Спсибо,
естественно я, как новичек, делал сдвиг данных в массиве в цикле.
Я не знал о процедуре move. Нужно попробовать.
Но думаю проблема останется из за того что все время нужно будет очищать и заносить данные в чарт.
Сейчас думаю сделать два чарта и когда один из них наполняется то старый обнуляется и данные зансятся в обнуленный.

Мне не совсем понятен последний код. Не могли бы вы дополнить его блоком описания переменных?
PM MAIL   Вверх
kami
Дата 3.5.2009, 12:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1806
Регистрация: 25.8.2007
Где: Санкт-Петербург

Репутация: 23
Всего: 72



Цитата(СЭНСЭЙ @  3.5.2009,  11:40 Найти цитируемый пост)
Мне не совсем понятен последний код.

А мне не совсем понятно, какой массив используется.
Если одномерный, т.е.
Код

myArray=array of real
, то Move - идеальный вариант.
Если для каждой выборки результатов свой массив, т.е.
Цитата(СЭНСЭЙ @  2.5.2009,  17:36 Найти цитируемый пост)
 регулярно выгружатся данные в буфер с периодичностью около секунды

или (иначе) 
Код

myArray=array of array of real

то лучше использовать вариант с TList.

Поясняю последний:
Код

var
  myList:TList; // создаем в OnCreate, уничтожаем в OnDestroy формы.

// далее - не знаю, как детерминируется периодичность выборки данных, для простоты будем считать что в OnTimer.
procedure TForm1.OnTimer(Sender:TObject);
var
  tmpArray:array of Real; // временный массив для текущей выборки данных.
begin
  SetLength(tmpArray, 0);
  if myList.Count>600 then // ограничение на 600 выборок заложено вами в вопросе.
    // если на текущий момент их больше, то убираем первую
    begin
      tmpArray:=myList[0]; // забрали нулевую выборку
      myList.Delete(0); // и убрали ее из общего списка
    end;
  GetNewChartData(tmpArray); // здесь получаем в убранный из общего списка массив новые данные для чарта.
  myList.Add(tmpArray); // добавляем уже новые данные в конец списка.
  // все - в myList содержатся все действующие на данный момент выборки, в нужном порядке
  // от myList[0] до myList[myList.Count-1]
  // остается только отобразить их.
  DisplayChartData(myList);
end;


отображение и саму выборку данных, т.е. процедуры GetNewChartData и DisplayChartData оставляю на вашей совести. Ибо не имею ни малейшего представления об архитектуре приложения.

Добавлено @ 12:32
Хотя, общие принципы GetNewChartData можно и изложить:
Код

procedure TForm1.GetNewChartData(var DataArray:array of Real);
begin
  // определение количества новых данных.
  SetLength(DataArray, NewLength);
  // здесь - заполнение элементов массива новыми данными.
  // Все.
end;


Это сообщение отредактировал(а) Rrader - 3.5.2009, 14:22
PM MAIL WWW   Вверх
СЭНСЭЙ
Дата 4.5.2009, 14:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 432
Регистрация: 20.3.2006

Репутация: нет
Всего: нет



Спасибо!
Пока что играюсь с процедурой move.
У чартов обнаружил глюк когда их начинаешь скрывать.
Решил проблему меняя top чартов. Тому что нужно скрыть присваиваю отрицательное значение top.
Все работает отлично даже на скорости 1кГц.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

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

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0446 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.