namelos |
Отправлено: 08.02.2007, 23:45 |
|
Ученик-кочегар
Группа: Участник
Сообщений: 13
|
Доброго времени суток.
Задача построить график изменения температуры в течении отрезка времени мах 24 часа (думаю с помощью TChart). Температура снимается каждые 5секунд. Отрезок времени можно задавать(менять). Что посоветуете базу данных или массив?Или какие-нибудь другие идеи? Буду рад любой информации. Спасибо заранее.
Отредактировано namelos — 08.02.2007, 23:48 |
|
Valdemar |
Отправлено: 09.02.2007, 08:48 |
|
Мастер участка
Группа: Участник
Сообщений: 433
|
Для хранения данных лучше использовать базу данных, а не массив. А график строить можно с помощью TChart или самостоятельно рисовать. |
|
AVC |
Отправлено: 09.02.2007, 09:12 |
|
Ветеран
Группа: Модератор
Сообщений: 1583
|
QUOTE (namelos @ 08.02.2007, 22:45) | Доброго времени суток.
Задача построить график изменения температуры в течении отрезка времени мах 24 часа (думаю с помощью TChart). Температура снимается каждые 5секунд. Отрезок времени можно задавать(менять). Что посоветуете базу данных или массив?Или какие-нибудь другие идеи? Буду рад любой информации. Спасибо заранее.
|
Смотря что планируется делать дальше с этим рядом.
- Если просто показ графика, то можно ограничится и массивом
- Если только показ + истории предыдущих запусков приложения — файл подходящей структуры.
- А если что то серъезнее показа — то таблица БД.
|
|
namelos |
Отправлено: 09.02.2007, 14:23 |
|
Ученик-кочегар
Группа: Участник
Сообщений: 13
|
Спасибо за советы. Как я понял, лучше воспользоваться массивом. К сожалению забыл уточнить, программа обработки температуры будет работать постоянно. Массив float у меня ограничен на 24 часа (замер каждые 5 сек = 17 280 членов), т.е. мне надо постоянно двигать на 1 все члены массива при каждой записи информации и это только для одного сенсора, а у меня их 8 (8x17280). Может кто подскажет как с мне лучше данные в массив записывать, а то Realtime графика может и не получиться.
Отредактировано namelos — 09.02.2007, 14:24 |
|
AVC |
Отправлено: 09.02.2007, 15:03 |
|
Ветеран
Группа: Модератор
Сообщений: 1583
|
QUOTE (namelos @ 09.02.2007, 13:23) | мне надо постоянно двигать на 1 все члены массива при каждой записи информации и это только для одного сенсора, а у меня их |
???
Зачем двигать элементы массива когда достаточно изменять содержимое указателей.
Добавлено.
Да. Для графика.
8 датчиков через 5сек — это не тот объем информации при котором стоит задумываться о времени на смещение.
И уж если станет совсем туго то можно забыть о том что это массив чего-то и поманипулировать памятью, занимаемой этим массивом. Это будет очень быстро.
Прямо сию секунду посмотрел программу, которая снимает некие контрольные показания в асинхронном режиме и строит графики.
Данные храняться в текстовом файле и массиве.
На данный момент задействовано 10 каналов.
Для самого "жирного" число точек 1 089 232, размер файла 109M
Все замеры и сохранения и отрисовки графиков выполняются без заметных тормозов.
ps. Попутно эта же программа "звонит сеть" внешнюю и внутреннюю.
Машина самая обыкновенная, P4 2.2 |
|
nawok78 |
Отправлено: 09.02.2007, 15:44 |
|
Станционный диспетчер
Группа: Участник
Сообщений: 115
|
ну например:
CODE |
#define ARRAY_SIZE 17280
static float *my_array;
.........
void refresh (folat newvalue)
{
foat *tmp = calloc (ARRAY_SIZE, sizeof(float));
memcpy(tmp, my_array+1, ARRAY_SIZE-1);
tmp[ARRAY_SIZE-1]=newvalue;
free my_array;
my_array=tmp;
}
|
разумеется my_array должен быть проинициирован в начале
CODE |
void AfterStart()
{
my_array= calloc (ARRAY_SIZE, sizeof(float));
}
|
кстати calloc заполняет 0 выделяемую память |
|
namelos |
Отправлено: 09.02.2007, 16:19 |
|
Ученик-кочегар
Группа: Участник
Сообщений: 13
|
QUOTE (AVC 09.02.2007 @ 09:12) | Зачем двигать элементы массива когда достаточно изменять содержимое указателей |
Что-то я не очень понял по поводу указателей. Вот пример моего кода:
CODE |
float temperature
float massive[1000];
int counter=0;
function(OnTimer)
{
if (counter>999)
{
for(i=0;i<999;i++)massive[i]=massive[i+1];
massive[999]=temperature;
}
else
{
massive[counter]=temperature;
counter++;
}
}
|
QUOTE (AVC 09.02.2007 @ 09:12) | поманипулировать памятью, занимаемой этим массивом |
И еще уважаемый AVC, может по подробнее обьясните про манипулирование или ссылку дадите.
Спасибо заранее и хороших выходных.
Отредактировано namelos — 09.02.2007, 16:54 |
|
namelos |
Отправлено: 09.02.2007, 16:24 |
|
Ученик-кочегар
Группа: Участник
Сообщений: 13
|
Спасибо nawok78... |
|
AVC |
Отправлено: 12.02.2007, 09:37 |
|
Ветеран
Группа: Модератор
Сообщений: 1583
|
QUOTE (namelos @ 09.02.2007, 15:19) | может по подробнее обьясните про манипулирование или ссылку дадите.
|
Сцылка — пост nawok78 как вариант
(Только зачем каждый раз память перезавхватывать? Можно работать в рамках исходного массива)
А лучше использовать stl. |
|
nawok78 |
Отправлено: 12.02.2007, 09:51 |
|
Станционный диспетчер
Группа: Участник
Сообщений: 115
|
QUOTE | Можно работать в рамках исходного массива |
типа:
CODE |
#define ARRAY_SIZE 17280
static int current=0;
static float a[ARRAY_SIZE];
float readitem(int index)
{
return a[(index+current)%ARRAY_SIZE];
}
void newitem(float newValue)
{
a[(++current)%ARRAY_SIZE]=newValue;
}
void drowall ()
{
for (int i=0; i<ARRAY_SIZE; i++)
lineto(0, 0, 0, readitem(i)); // это абсолютно условно :) просто показал доступ к элементам массива
}
|
Отредактировано nawok78 — 12.02.2007, 09:52 |
|
AVC |
Отправлено: 12.02.2007, 10:18 |
|
Ветеран
Группа: Модератор
Сообщений: 1583
|
2nawok78
Это вариант типа кардиографа. Текущая точка каждый раз в новом месте. Да?
Я имел ввиду сдвиг для освобождения элементов. Если массив расположен в едином блоке, то использование что то типа memcpy вместо for для сдвига части элементов может повысить скорость алгоритма.
2namelos
Еще раз, посмотрите в сторону stl. |
|
nawok78 |
Отправлено: 12.02.2007, 11:03 |
|
Станционный диспетчер
Группа: Участник
Сообщений: 115
|
у меня как-то проблемы были с memcpy ...
помоему она не работает с пересеченными адресными пространствами..
ну т.е какраз сдвиги внутри куска памяти.
вроде memmove подходит для этого....
но когда у меня возникли проблемы этого не хватило пришлось делать как я до этого показывал — выделять новую память...
компилятор gcc — не помню уже версию (Mandrake 10)
весело было помню — писал классы на C — ООП форэва
а что-такое stl? |
|
namelos |
Отправлено: 13.02.2007, 01:31 |
|
Ученик-кочегар
Группа: Участник
Сообщений: 13
|
Спасибо за предложенные варианты, решил воспользоваться предложением Adilya, использовать массив TChart, намного проще так как функция delete() все и реализует. Вот пример кода.
CODE |
#define MEMORY_SIZE 17200
counter=0;
Chart_TrendGraph->BottomAxis->AutomaticMinimum=true;
Chart_TrendGraph->BottomAxis->AutomaticМахimum=true;
OnTimer()
{
if (Chart_TrendGraph->Series[i]->Count()<MEMORY_SIZE)
Chart_TrendGraph->Series[i]->AddXY( Time(),sensor[i],"",clBlue);
else
{
Chart_TrendGraph->Series[i]->Delete(0);
Chart_TrendGraph->Series[i]->AddXY( Time() ,sensor[i],"",clBlue);
}
if(counter>1)
{
Chart_TrendGraph->BottomAxis->AutomaticMinimum=false;
Chart_TrendGraph->BottomAxis->Minimum =Time()- EncodeTime(0,10,0,0);
}
else counter++;
} |
Работает, правда, почему-то выдает ошибку,что min должен быть <= max, если я ввожу минимум сразу, поэтому приходится вводить min только на следующий раз.В чем причина не могу понять?
И вообще какой-то странный bug иногда выскакивает и наследующий раз, увеличил условие до 2х проходов таймера( if(counter>1)), теперь как будто не вылазит. Что скажете господа-профессионалы?
Отредактировано namelos — 13.02.2007, 12:05 |
|