Russian Qt Forum

Qt => Общие вопросы => Тема начата: ¤Se®ega¤ от Апрель 09, 2009, 11:17



Название: 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) раз.плюс затраченное время на обработку данных в методе.Коряво, но мне особо и не надо ,надеюсь ))).