Точность контрола Timer

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
Source
Постоялец
Постоялец
 
Сообщения: 351
Зарегистрирован: 04.09.2007 (Вт) 11:21

Точность контрола Timer

Сообщение Source » 29.02.2008 (Пт) 2:49

Чё-то у меня создаётся такое ощущение, что таймер работает с минимальным интервалом 15.625 мсек, а не 1 мсек. Может, не стоит даже ставить Interval=1, т.к. может, это только тормозит выполнение...
Буря мглою небо кроет, вихри снежные крутя, то как зверь с VB завоешь, то заплачешь, как дитя...

Twister
Теоретик
Теоретик
Аватара пользователя
 
Сообщения: 2251
Зарегистрирован: 28.06.2005 (Вт) 12:32
Откуда: Алматы

Сообщение Twister » 29.02.2008 (Пт) 8:17

Так и есть.
А я все практикую лечение травами...

Viper
Артефакт VBStreets
Артефакт VBStreets
Аватара пользователя
 
Сообщения: 4394
Зарегистрирован: 12.04.2005 (Вт) 17:50
Откуда: Н.Новгород

Сообщение Viper » 29.02.2008 (Пт) 8:18

Интервал 1 мс точно не надо ставить, не будет он работать с такой точностью. Вообще интервалы менее 50 мс смысла не имеют. Собственно это особенность ОС Windows.
З.Ы. А в чем собстно проблема, что надо реализовать то?
Весь мир матрица, а мы в нем потоки байтов!

Source
Постоялец
Постоялец
 
Сообщения: 351
Зарегистрирован: 04.09.2007 (Вт) 11:21

Сообщение Source » 11.03.2008 (Вт) 5:20

я не пойму, как определяется интервал таймера? Думал, что выравнивается по 15.625 в большую сторону, но оказалось, не всегда. Тест был сделан по проге во вложении.
Кто це такой умный сделал замену N пробелов одним? Нельзя показать данные в табличном виде.
Вложения
MinIntervalTimer.zip
(831 байт) Скачиваний: 54
Буря мглою небо кроет, вихри снежные крутя, то как зверь с VB завоешь, то заплачешь, как дитя...

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 11.03.2008 (Вт) 11:38

1. Читай, что тебе отвечают. Хотя если тебе нравится биться лбом в стену -- дело твое.
2. Чтобы показывать таблицы, используй тэг code.
3. VB (как и Windows) не являются системами реального времени. Более точным таймером является мультимедийный, но что-то мне подсказывает, что тебе это не поможет.
Lasciate ogni speranza, voi ch'entrate.

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 11.03.2008 (Вт) 12:10

Кто це такой умный сделал замену N пробелов одним?

Nathan Codding
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Source
Постоялец
Постоялец
 
Сообщения: 351
Зарегистрирован: 04.09.2007 (Вт) 11:21

Сообщение Source » 11.03.2008 (Вт) 12:21

может кто-то пояснит насчёт рассчёта интервала таймера?
Буря мглою небо кроет, вихри снежные крутя, то как зверь с VB завоешь, то заплачешь, как дитя...

Atoman
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 109
Зарегистрирован: 01.02.2008 (Пт) 6:36

Сообщение Atoman » 11.03.2008 (Вт) 12:33

Из справочника по Visual C++

К сожалению, точность виртуального таймера оставляет желать лучшего. Сообщения таймера проходят через очередь приложения, к тому же другое приложение может блокировать на некоторое время работу вашего приложения. Поэтому сообщения от таймера приходят в общем случае нерегулярно. Кроме того, несмотря на возможность указания интервалов времени в миллисекундах, реальная дискретность таймера определяется периодом прерываний, посылаемых таймером. Этот период (то есть длительность одного такта таймера) можно узнать с помощью функции GetTimerResolution

Source
Постоялец
Постоялец
 
Сообщения: 351
Зарегистрирован: 04.09.2007 (Вт) 11:21

Сообщение Source » 11.03.2008 (Вт) 12:51

и почему же при указании интервала 16мс таймер сходит с периода?
Буря мглою небо кроет, вихри снежные крутя, то как зверь с VB завоешь, то заплачешь, как дитя...

Viper
Артефакт VBStreets
Артефакт VBStreets
Аватара пользователя
 
Сообщения: 4394
Зарегистрирован: 12.04.2005 (Вт) 17:50
Откуда: Н.Новгород

Сообщение Viper » 11.03.2008 (Вт) 13:22

Source писал(а):и почему же при указании интервала 16мс таймер сходит с периода?

Осилить предыдущие посты не судьба?
Весь мир матрица, а мы в нем потоки байтов!

Source
Постоялец
Постоялец
 
Сообщения: 351
Зарегистрирован: 04.09.2007 (Вт) 11:21

Сообщение Source » 11.03.2008 (Вт) 18:57

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

Lumen
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 841
Зарегистрирован: 03.12.2005 (Сб) 16:09
Откуда: Брянск

Сообщение Lumen » 11.03.2008 (Вт) 19:42

Windows - это не realtime OS, поэтому не жди точности больше 50 мс оттаймеров, дело в том, что функция (callback) таймера вызывается обработкой сообщения WM_TIMER функцией GetMessage из цикла обработки сообщений, соответсвенно, это полностью синхронный вызов, т.е. он произойдёт только когда поток получит CPU:
Нюансом здесь является период времени вызова аппаратного прерывания (quantum) и количество времени, выделяемого каждому потоку (time slice). Этой информации вы не найдете ни в одной документации, и тому есть причина: Microsoft Windows не претендует на звание "Real-time OS". Просто гарантируется, что все будет нормально работать для обычных (читай: офисных) приложений.
Эти временные промежутки отличаются в разных версиях Windows, и для Windows XP составляют quantum=10ms, time slice = 130ms (!).

time slice = 130ms означает, что поток, по существу, может не получить CPU в течении времени ≥ 130ms (зависит от посторонней активности). ВотЪ...
А если нужна более высокая точность, то можно посмотреть в сторону мультимедийного таймера (timeSetEvent + timeKillEvent), у него приоритет повыше, следовательно и точность будет лучше, либо в сторону QueryPerfomanceCounter...
ЗЫ: цитата взята отсюда. ИМХО довольно интересная статья...
Подпись проходит рефакторинг

ANDLL
Великий гастроном
Великий гастроном
Аватара пользователя
 
Сообщения: 3450
Зарегистрирован: 29.06.2003 (Вс) 18:55

Сообщение ANDLL » 11.03.2008 (Вт) 20:36

...причем процесс может вообще не получать управления скажем в течении парочки минут. Это может быть ввиду чрезмерной активности драйвера или процесса с достаточно высоким приоритетом
Гастрономия - наука о пище, о ее приготовлении, употреблении, переварении и испражнении.
Блог

Lumen
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 841
Зарегистрирован: 03.12.2005 (Сб) 16:09
Откуда: Брянск

Сообщение Lumen » 11.03.2008 (Вт) 20:56

Да, точно. Этот факт тоже нельзя упускать из виду...
Подпись проходит рефакторинг

Source
Постоялец
Постоялец
 
Сообщения: 351
Зарегистрирован: 04.09.2007 (Вт) 11:21

Сообщение Source » 12.03.2008 (Ср) 4:49

Господа программеры, ещё раз спрашиваю, почему постоянно при указании интервала таймера 16 мс реальный вызов таймера не попадает в значение, кратное 15.625, в то время как постоянно попадает в это значение при большинстве остальных указанных интервалах?
Почему, например, при указании интервала 15 таймер вызывается с интервалом 15.625, а при 16 - с интервалом 25, хотя 15.625 намного ближе к 16? Аналогично 31 - 31.25, 32 ~ 42?
alibek, не нервничай, зайка... всё будет Ok.
под постоянно имелось ввиду нормальный режим работы, без перегрузов проца и т.д., а то ещё найдутся добрые люди, которые и об этом захотят поговорить :)
Буря мглою небо кроет, вихри снежные крутя, то как зверь с VB завоешь, то заплачешь, как дитя...

ANDLL
Великий гастроном
Великий гастроном
Аватара пользователя
 
Сообщения: 3450
Зарегистрирован: 29.06.2003 (Вс) 18:55

Сообщение ANDLL » 12.03.2008 (Ср) 14:01

Ну вобщемто сабж абсолютно невминяем...
Однажды сие даже постучало ко мне в аську... Жаль историю не сохранил :)
Гастрономия - наука о пище, о ее приготовлении, употреблении, переварении и испражнении.
Блог

Source
Постоялец
Постоялец
 
Сообщения: 351
Зарегистрирован: 04.09.2007 (Вт) 11:21

Сообщение Source » 12.03.2008 (Ср) 22:56

А с чего ты взял, что сиё стучалось к тебе в Аську? :shock:
Буря мглою небо кроет, вихри снежные крутя, то как зверь с VB завоешь, то заплачешь, как дитя...

uk8amk
Обычный пользователь
Обычный пользователь
 
Сообщения: 67
Зарегистрирован: 26.07.2007 (Чт) 16:52
Откуда: Tashkent

Сообщение uk8amk » 13.03.2008 (Чт) 8:10

Товарищи программеры, меня тоже интересует тема прерывания процессов через точные интервалы по таймеру. Разумеется что для такого приложения необходимо установить приоритет реального времени. Однако я ранее слышал о библиотеках таймеров написанных на языках ассемблера сторонними разработчиками. По утверждениям такие библиотеки способны давать хорошую точность генерируемых интервалов времени. Кти-нибудь может дать линк на такую библиотеку для ВБ?

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 13.03.2008 (Чт) 9:35

uk8amk, VB плохо подходит для таких задач.
Лучше пиши программу под DOS. Лучше, конечно, на ассемблере, но можно даже и на бейсике (Turbo Basic), если его производительности хватит.
Lasciate ogni speranza, voi ch'entrate.

Mikle
Изобретатель велосипедов
Изобретатель велосипедов
Аватара пользователя
 
Сообщения: 4148
Зарегистрирован: 25.03.2003 (Вт) 14:02
Откуда: Туапсе

Сообщение Mikle » 13.03.2008 (Чт) 18:53

alibek
Turbo Basic :roll: :?:
Не хочется раздувать холивар, но, может, все-таки, QB?

ANDLL
Великий гастроном
Великий гастроном
Аватара пользователя
 
Сообщения: 3450
Зарегистрирован: 29.06.2003 (Вс) 18:55

Сообщение ANDLL » 13.03.2008 (Чт) 19:20

Mikle
Можно хоть на VB(для доса), сдается мне alibek не хотел акцентировать именно диалект языка
Гастрономия - наука о пище, о ее приготовлении, употреблении, переварении и испражнении.
Блог


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: Yandex-бот и гости: 24

    TopList