Russian Qt Forum
Ноябрь 25, 2024, 18:37 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: timeBeginPeriod и timeEndPeriod  (Прочитано 9321 раз)
¤Se®ega¤
Гость
« : Апрель 09, 2009, 11:17 »

Мне необходимо запускать определенный метог с частотой примерно 50 раз в секунду ( 20 мс), с помощью обычного таймера такой частоты не достичь,либо больше либо меньше. Слышаб об использовании timeBeginPeriod и timeEndPeriod? но только слышал, хотел бы узнать как это использовать, ну или если кто знает ка достичь такой частоты другими средствами?
Записан
Rcus
Гость
« Ответ #1 : Апрель 09, 2009, 11:28 »

А почему не достичь? В доках по QTimer говорится о разрешении в 1 милисекунду на большинстве платформ.
Записан
¤Se®ega¤
Гость
« Ответ #2 : Апрель 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;
}
Записан
¤Se®ega¤
Гость
« Ответ #3 : Апрель 10, 2009, 04:25 »

Как говориться сам пошутил сам и посмеялся.Посидел тут посидел и придумал.Правда не знаю правильно ли.Я в первом таймере делаю Sleep(20), тоесть за 1 секунду метод по таймеру исполняется 50 раз (- время на обработку оставшегося в методе),итого получается порядка 49fpsюПроверяю через программу fraps, выдает тоже самое, но гораздо быстрее.

Я понимаю что это все равно что пальцем в небо попасть.Но кто что скажет? Непонимающий
Записан
IMPOMEZIA
Гость
« Ответ #4 : Апрель 10, 2009, 12:01 »

А почему не достичь? В доках по QTimer говорится о разрешении в 1 милисекунду на большинстве платформ.
Windows к большинству не относится.  Смеющийся

¤Se®ega¤
Есть тема где подробно освещены проблемы таймеров, вкратце разрешение стандартного таймера в винде ~15,6 мс.
http://www.forum.crossplatform.ru/index.php?showtopic=2429&pid=17879&st=0
Записан
Rcus
Гость
« Ответ #5 : Апрель 10, 2009, 12:15 »

Так давайте определимся мы говорим о стандартных виндовых таймерах или о QTimer? В модифицированной демке widgets/wiggly под WindowsXP выдает до 999 срабатываний таймера.
Чтение ./src/corelib/kernel/qeventdispatcher_win.cpp помогает в понимании сего феномена: при интервале более 10 мс используется стандартный таймер, а при меньших - из winmm
« Последнее редактирование: Апрель 10, 2009, 12:19 от Rcus » Записан
¤Se®ega¤
Гость
« Ответ #6 : Апрель 10, 2009, 13:33 »

Мне как то все равно что QTimer что таймеры,суть одна: надо определенным образом задвать период работы метода,так, чтобы он работал с частотой порядка 50 fps, хоть через цыкли, если их написать так, чтобы они везде работали одинако(что навряд ли).
Записан
kitov
Гость
« Ответ #7 : Апрель 10, 2009, 18:14 »

Можно отдельную нить запустить с sleep-ом .
У меня были проблемы с таймером в Вин2000 , не помню какой версии была Qt , таймер срабатывал очень медленно .
Тролли сказали что всё нормально ибо таймеры ОС-зависимы .
Записан
IMPOMEZIA
Гость
« Ответ #8 : Апрель 10, 2009, 18:24 »

QBasicTimer и QTimer используют int QObject::startTimer ( int interval ), в описании которого:
Цитировать
Most platforms support an accuracy of 20 milliseconds; some provide more.
Не стыковка в документации получается.
« Последнее редактирование: Апрель 10, 2009, 18:27 от IMPOMEZIA » Записан
Alex Custov
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2063


Просмотр профиля
« Ответ #9 : Апрель 10, 2009, 22:59 »

Мне как то все равно что QTimer что таймеры,суть одна: надо определенным образом задвать период работы метода,так, чтобы он работал с частотой порядка 50 fps, хоть через цыкли, если их написать так, чтобы они везде работали одинако(что навряд ли).

сделай тогда цикл, в основной ветке или в потоке как сказали. Внутри цикла рассчитывай время отработки нужных методов, и потом sleep на 50-[рассчитанное время], если [рассчитанное время] < 50. И не стоит забывать, что sleep(n) необязательно проспит n указанных единиц времени. OS-specific опять же.
Записан
¤Se®ega¤
Гость
« Ответ #10 : Апрель 11, 2009, 01:50 »

Да я уже сделал через sleep.запустил 2 таймера: первый просто start(), второй start(1000), и привязал первый таймер к методу в котором делаю sleep(19), таким образом получается что за 1 секунду метод выполняется не более 1000/19 (52,6) раз.плюс затраченное время на обработку данных в методе.Коряво, но мне особо и не надо ,надеюсь ))).
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.073 секунд. Запросов: 23.