![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Элемент Timer
Петр © (2004-09-04 10:09:00)Hi
Ув. господа надо вызывать одну функцию каждую секунду, но событие onTimer происходит не через Timer.interval=1000, а через 1050-1200 мс. в результате чего некоторые секунды пропускаются. Если поставить интервал меньше, то функция иногда вызывается 2 раза в секунду и некоторые секунды пропускаются все равно.
С нетерпением жду ваших мнений.
Петр (2004-09-05 09:16:00) [1]Большое спасибо, получилось
Yr2 (2004-09-04 16:00:00) [2]To atruhin
Уважаемый atruhin, будьте внимательны.
1. Свойство таймера задает ПЕРИОД (1с = 1000мс)! По теореме Котельникова ЧАСТОТА дискретизации должна быть действительно не ниже, частоты сигнала, а быть в два и более раза выше (то есть больше), чем частота дискретезуемого сигнала. Это означает, что ПЕРИОД будет в два раза меньше, т.е. 500 мс для нашего случая.
2. К данному случаю теорема Котельникова имеет отношение, т.к. мы рассматриваем сигнал в виде единичных отсчетов с односекундным интервалом. И наша задача - не пропустить ни одного отсчета. Как это сделать - чит. теорему.
3. Если Вы из OldTime сделаете "текущий счетчик секунд", то это как раз ничего не даст. Мало того, когда нибудь он у Вас переполнится...
В моем варианте OldTime - это всего лишь переменная для хранения значения предыдущего отсчета времени для того, чтобы сравнивать его с текущим, т.е. с NewTime.
atruhin (2004-09-04 14:52:00) [3]>а по теореме Котельникова/Найквиста о частоте дискретизации >сигналов лучше всего половину секунды, т.е. 500
Может меня не правильно учили, но там говориться что частота должна быть не ниже, да и к данному случаю это не совсем имеет отношение.
поправка:
OldTime - не системное время а текущий счетчик секунд. иначе будет накопление ошибки.
Yr2 (2004-09-04 11:09:00) [4]Если я правильно понял, то тебе нужно не точное попадание в секунду системного времени, а нужно зафиксировать факт изменения КАЖДОЙ секунды.В таком случае заведи глобальную перемнную OldTime; сделай интервал таймера меньше 1-й секунды (а по теореме Котельникова/Найквиста о частоте дискретизации сигналов лучше всего половину секунды, т.е. 500). При срабатывании таймера Получай значение системного времени в NewTime и сравнивай с OldTime. Если NewTime=OldTime, то ничего не делаем, иначе
begin
OldTime:=NewTime;
MyFunction;
end;
KilkennyCat (2004-09-04 10:31:00) [5]Что стандартный таймер неточный - это не новость.
Используйте другой, или пишите свой.