![]() |
|
Модераторы: volvo877, Snowy, MetalFan |
![]()
|
|
| ausar |
|
||||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 127 Регистрация: 3.8.2007 Репутация: нет Всего: нет |
Привет! Помогите разобраться с системным таймером.Никак не могу заставить работать счетчик секунд на основе системного таймера. Вот чего я достиг. Итак доступ непосредственно к счетчику можно получить через
Везде написано что системный таймер производит 18.2 импульсов в сек. Скажем мне необходимо чтоб таймер отсчитывал секнды. Я понимаю что можно взять начальное показание таймера затем с каждым импульсом сравнивать его не достигло ли оно разницы в 18.2 и тогда увеличивать какой нибудь счетчик. Но никак не могу это сделать. Все время тянет на что нибудь эдакое
Ну и вполне логично что как надо не получилось. |
||||
|
|||||
| Snowy |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 11363 Регистрация: 13.10.2004 Где: Питер Репутация: нет Всего: 484 |
А не надо считать по 18.2
Это округлённая цифра. Считай по 55. Счётчик увеличивается на 1 каждые 55 милисекунд. Соответственно пройденное время будет = (i-z) * 55 миллисекунд. |
|||
|
||||
| ausar |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 127 Регистрация: 3.8.2007 Репутация: нет Всего: нет |
Да нет мне нужно точно
Это сообщение отредактировал(а) ausar - 3.9.2008, 10:20 |
|||
|
||||
| ausar |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 127 Регистрация: 3.8.2007 Репутация: нет Всего: нет |
Вот дошло дело и до завершения. Бьюсь вот над какой проблемой. Мне необходимо сделать часы которые при запуске перехватывают показания системных часов а потом при помощи таймера и прерываний отсчитывают время самостоятельно. В принципе проблема оказалась разрешимой. Количество импульсов - целое число т.е реально их в 1 сек полностью 18. Если так то часы будут отставать и спустя некоторое время погрешность станет ощутимой. Но насколько я понял погрешность можно ликвидировать на каждой 5й секунде когда округленные .2 от 18.2 превратятся в 1 лишний импульс. Или яне прав? т.е если после каждой 5 сек прибавлять 1 импульс то часы должны идти отностительно ровно.
Я написал вот такое
вроде бы теоретически все должно работать но. Почему же часы все равно через некоторое время начинают отставать? Я сверяю с часами в нортоне т.е с ситемными часами из под дос. Может прога просто тормозит? Помогите разобраться в ситуации. |
|||
|
||||
| Snowy |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 11363 Регистрация: 13.10.2004 Где: Питер Репутация: нет Всего: 484 |
Так вот я тебе и говорю - если нужно точно, то забудь число 18.2
Точное число - 55 Каждый тик таймера = 55мс А, если будешь использовать число 18.2, то со временем погрешность будет накапливаться, ибо, как видим, в одной секунде тиков не 18.2, а 1000мс / 55мс = 18.181818181818181818181818181818..... и т.д. Если округлить, то получим пресловутые 18.2, но это число теоретическое. Использовать его нельзя, ибо погрешность. |
|||
|
||||
| ausar |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 127 Регистрация: 3.8.2007 Репутация: нет Всего: нет |
Так вот в этом то и смысл. Т.е действительно тиков реально 18 но в 1 сек их 18.2. Если мы будем отрезать эти 2 десятых доли тика то получим погрешность. Вот в я и бьюсь над тем чтобы погрешность ликвидировать. Если в сек 18.2 тиков то в минуте их 1092. Если мы будем считать каждую секунду только по 18 тиков то в нашей минуте у нас будет 1080 т.е на 12 меньше чем надо. Так вот идея и состоит чтобы вставить эти 12 тиков и добиться ровно счета не на секундах (все равно не заметно) а на минутах. На каждой 5 сек мы можем добавить 1 лишний тик чтобы в конце минуты у нас получилось ровно 1092 тика.
Почему нельзя так? Почему нельзя просто постепенно компенсировать погрешность? Я вроде бы правильно все сделал в коде. Каждые 5 сек я добавляю лишний тик за счет того что в 6й секунде не 18 тиков а 19. |
|||
|
||||
| Snowy |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 11363 Регистрация: 13.10.2004 Где: Питер Репутация: нет Всего: 484 |
Ты читаешь, что я пишу?
В СЕКУНДЕ НЕ 18.2 ТИКА! И не 18 и не 19 и не 548 тиков. Тик неделим. Длина одного тика 55 милисекунд. Под секунду его не подогнать. И 0.2 тика перекидывать бессмысленно, ибо остаток меньше, чем 0.2 Вот именно. Если. В секунде 1000/55 тиков, а не 18.2. Что равно 18.(18) тика. Если ты считаешь, что в секунде 18.2 тика, то за минуту твои расчёты будут спешить более, чем на 1 секунду. (18.2 - 18.(18) ) * 60 = 1.(09) секунды. Кстати, в минуте не 1092 тика, а 1090.(90), или, если округлить, то 1090.91 Поэтому ещё раз говорю. Используй длину тика, а не количество тиков в секунде. Я же написал, как измерить количество секунд. (текущий тик - начальный тик) * 55 div 1000 Точное число - 55. А 18.2 - это приблизительное число, с помощью которого просто пытаются объяснить в учебнике. Утверждать, что в секунде 18.2 тика, то же самое, что утверждать,что число Пи = 3.14 Да. Число Пи приблизительно равно 3.14. Но для расчётов такой точности мало. Просто возьми калькулятор и раздели 1000 миллисекунд (то есть секунду) на длину одного тика (55 миллисекунд). 18.2 ты никак не получишь. |
|||
|
||||
| ausar |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 127 Регистрация: 3.8.2007 Репутация: нет Всего: нет |
Уж было закрыл тему но опять вот!
Это сообщение отредактировал(а) ausar - 4.9.2008, 04:08 |
|||
|
||||
| ausar |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 127 Регистрация: 3.8.2007 Репутация: нет Всего: нет |
Я перестал считать по 18.2 и по 18 и по 19 и... А как посоветовал Snowy передал код и начал считать по 55. Получилось вот так
Но это проблему не решило все равно показания моих часов постепенно начинают отличаться от системных. Что же это? Или это действительно порога так тормозит что показания начинают прыгать? Я заметил что при таком раскладе время время начинает отставать каждые 23 сек на 1 сек. Это сообщение отредактировал(а) ausar - 4.9.2008, 07:12 |
|||
|
||||
| volvo877 |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2073 Регистрация: 15.11.2004 Репутация: 2 Всего: 116 |
ausar, Вот так не хочешь попробовать:
Это сообщение отредактировал(а) volvo877 - 4.9.2008, 10:07 |
|||
|
||||
| ausar |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 127 Регистрация: 3.8.2007 Репутация: нет Всего: нет |
И снова! Volvo877 твой код работает ровно. Но не пойму по какой причине примерно за 20 минут работы опять набирается погрешность примерно в 1 сек. Даже не знаю в чем причина. Пробовал запускать под голым досом, думал под виндой комп тормозит.
|
|||
|
||||
![]()
|
| Правила форума "Delphi" | |
|
|
Запрещается! 1. Обсуждать и делится взломанными компонентами или программным обеспечением 2. Публиковать ссылки на варез 3. Оффтопить
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, THandle, Rrader, volvo877. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Object Pascal: кроссплатформенные технологии | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |