Название: timeBeginPeriod и timeEndPeriod Отправлено: ¤Se®ega¤ от Апрель 09, 2009, 11:17 Мне необходимо запускать определенный метог с частотой примерно 50 раз в секунду ( 20 мс), с помощью обычного таймера такой частоты не достичь,либо больше либо меньше. Слышаб об использовании timeBeginPeriod и timeEndPeriod? но только слышал, хотел бы узнать как это использовать, ну или если кто знает ка достичь такой частоты другими средствами?
Название: Re: timeBeginPeriod и timeEndPeriod Отправлено: Rcus от Апрель 09, 2009, 11:28 А почему не достичь? В доках по QTimer говорится о разрешении в 1 милисекунду на большинстве платформ.
Название: Re: timeBeginPeriod и timeEndPeriod Отправлено: ¤Se®ega¤ от Апрель 10, 2009, 01:56 ну я в том смысле что если использовать таймер и запускать по нему какое нибудь событие каждые 20мс, то по идее это событие исполнится 50 раз за секунду.Но в реале частота будет порядка 33 fps.Такая же частота будет если запускать метод таймером в диапазон 17-31мс.
Проверяю просто: slot_timer1() // тот что 20 мс { visible=!visible; ui.pushButton->setVisible(visible); counter++; } slot_timer2() //тот что раз в секунду { ui.spinBox->setValue(counter); counter=0; } Название: Re: timeBeginPeriod и timeEndPeriod Отправлено: ¤Se®ega¤ от Апрель 10, 2009, 04:25 Как говориться сам пошутил сам и посмеялся.Посидел тут посидел и придумал.Правда не знаю правильно ли.Я в первом таймере делаю Sleep(20), тоесть за 1 секунду метод по таймеру исполняется 50 раз (- время на обработку оставшегося в методе),итого получается порядка 49fpsюПроверяю через программу fraps, выдает тоже самое, но гораздо быстрее.
Я понимаю что это все равно что пальцем в небо попасть.Но кто что скажет? ??? Название: Re: timeBeginPeriod и timeEndPeriod Отправлено: IMPOMEZIA от Апрель 10, 2009, 12:01 А почему не достичь? В доках по QTimer говорится о разрешении в 1 милисекунду на большинстве платформ. Windows к большинству не относится. ;D¤Se®ega¤ Есть тема где подробно освещены проблемы таймеров, вкратце разрешение стандартного таймера в винде ~15,6 мс. http://www.forum.crossplatform.ru/index.php?showtopic=2429&pid=17879&st=0 Название: Re: timeBeginPeriod и timeEndPeriod Отправлено: Rcus от Апрель 10, 2009, 12:15 Так давайте определимся мы говорим о стандартных виндовых таймерах или о QTimer? В модифицированной демке widgets/wiggly под WindowsXP выдает до 999 срабатываний таймера.
Чтение ./src/corelib/kernel/qeventdispatcher_win.cpp помогает в понимании сего феномена: при интервале более 10 мс используется стандартный таймер, а при меньших - из winmm Название: Re: timeBeginPeriod и timeEndPeriod Отправлено: ¤Se®ega¤ от Апрель 10, 2009, 13:33 Мне как то все равно что QTimer что таймеры,суть одна: надо определенным образом задвать период работы метода,так, чтобы он работал с частотой порядка 50 fps, хоть через цыкли, если их написать так, чтобы они везде работали одинако(что навряд ли).
Название: Re: timeBeginPeriod и timeEndPeriod Отправлено: kitov от Апрель 10, 2009, 18:14 Можно отдельную нить запустить с sleep-ом .
У меня были проблемы с таймером в Вин2000 , не помню какой версии была Qt , таймер срабатывал очень медленно . Тролли сказали что всё нормально ибо таймеры ОС-зависимы . Название: Re: timeBeginPeriod и timeEndPeriod Отправлено: IMPOMEZIA от Апрель 10, 2009, 18:24 QBasicTimer и QTimer используют int QObject::startTimer ( int interval ), в описании которого:
Цитировать Most platforms support an accuracy of 20 milliseconds; some provide more. Не стыковка в документации получается.Название: Re: timeBeginPeriod и timeEndPeriod Отправлено: Alex Custov от Апрель 10, 2009, 22:59 Мне как то все равно что QTimer что таймеры,суть одна: надо определенным образом задвать период работы метода,так, чтобы он работал с частотой порядка 50 fps, хоть через цыкли, если их написать так, чтобы они везде работали одинако(что навряд ли). сделай тогда цикл, в основной ветке или в потоке как сказали. Внутри цикла рассчитывай время отработки нужных методов, и потом sleep на 50-[рассчитанное время], если [рассчитанное время] < 50. И не стоит забывать, что sleep(n) необязательно проспит n указанных единиц времени. OS-specific опять же. Название: Re: timeBeginPeriod и timeEndPeriod Отправлено: ¤Se®ega¤ от Апрель 11, 2009, 01:50 Да я уже сделал через sleep.запустил 2 таймера: первый просто start(), второй start(1000), и привязал первый таймер к методу в котором делаю sleep(19), таким образом получается что за 1 секунду метод выполняется не более 1000/19 (52,6) раз.плюс затраченное время на обработку данных в методе.Коряво, но мне особо и не надо ,надеюсь ))).
|