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

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

Страниц: 1 [2] 3   Вниз
  Печать  
Автор Тема: Аналог виндового мультимедиа таймера в Qt  (Прочитано 18584 раз)
Bepec
Гость
« Ответ #15 : Июнь 26, 2012, 09:31 »

Кхм. Хокс вы неправы.

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

Причём, если вы незнаете, виндосовский таймер как раз и базируется на МК. Точное её название не упомню, но она осталась с далёких времён.

И да, Ваш "вариант выхода" несовершенен по 1 простой причине - время прошедших секунд, считает ТОТ ЖЕ САМЫЙ таймер. И ЛЮБОЙ таймер на виндовсе основывается на том самом МК Улыбающийся Завязано всё на него, увы.

PS да, до сотен тактов в мс в Windows не добиться. Но оно там и нафиг ненужно. Для пользователя 25 мс - ничто. Для программиста это - почти вечность Улыбающийся

Хотите считать до 10000 тактов в секунду - программируйте на МК Улыбающийся
Записан
xokc
Птица говорун
*****
Offline Offline

Сообщений: 976



Просмотр профиля
« Ответ #16 : Июнь 26, 2012, 09:50 »

Причём, если вы незнаете, виндосовский таймер как раз и базируется на МК. Точное её название не упомню, но она осталась с далёких времён.
Не очень понимаю, что тут имеется в виду под МК - микроконтроллер?

И да, Ваш "вариант выхода" несовершенен по 1 простой причине - время прошедших секунд, считает ТОТ ЖЕ САМЫЙ таймер. И ЛЮБОЙ таймер на виндовсе основывается на том самом МК Улыбающийся Завязано всё на него, увы.
Ну всё же не совсем так. В качестве исходного генератора для мультимедиа таймера используется кварц, находящийся в звуковой плате. Он, в зависимости от её производителя, может быть как хуже, так и лучше по точности, чем кварц материнской платы. Кроме того, измерение времени через QueryPerformanceCounter существенно точнее, и чем GetTickCount Windows, и чем timeGetTime - MSDN об этом говорит следующее: The default precision of the timeGetTime function can be five milliseconds or more, depending on the machine. ... Use the QueryPerformanceCounter and QueryPerformanceFrequency functions to measure short time intervals at a high resolution.

PS да, до сотен тактов в мс в Windows не добиться. Но оно там и нафиг ненужно. Для пользователя 25 мс - ничто. Для программиста это - почти вечность Улыбающийся
Хотите считать до 10000 тактов в секунду - программируйте на МК Улыбающийся
Не вижу, где я утверждал бы обратное.
Записан
Bepec
Гость
« Ответ #17 : Июнь 26, 2012, 10:39 »

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

Кьюред - сам определяет с помощью какого устройства лучше генерировать тики. Но в любом случае будет погрешность Веселый  Опять таки 15мс - железо машины.

Цитировать
По-прежнему частота импульсов на выходе нулевого канала таймера равна приблизительно 18.2 герц (в зависимости от комплектации компьютера)
Это цитата Микрософта. Именно эта константа не даст тебе и мне,  и кому-либо другому подсчитать время точнее. Повысить частоту можно - достаточно спаять свою материнку Веселый

Есть выход - собственный таймер, собственное устройство, подключаемое к PCI/USB и собственная ОС реального времени Веселый

Иначе - увы.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #18 : Июнь 26, 2012, 10:53 »

Как один из вариантов выхода из этой ситуации - учитывать время срабатывания таймера и вызывать обработчик таймера столько раз, сколько "лишних" тиков уже накопилось. Например, если нужен интервал в 10 мс, а с момента последнего срабатывания прошло 22 мс, то вызывать обработчик 2 раза и запомнить, что 2 мс ещё осталось и их тоже надо учесть при следующем вызове.
Я пользуюсь примерно таким же способом, и это работает хорошо. Псевдокод
Код
C++ (Qt)
void MyTimerProc( void )
{
int numFramesNeed = (currentTime() - startTime) / frameTime;  // сколько кадров должно быть показано
if (numFramesNeed > numFramesDone) {  // если больше чем сделано - показываем следующий
 ++numFramesDone;
 ShowFrame();
}
}
 
При этом интервал таймера просто в 2 раза меньше frameTime, ну можно в 3 или 4 если хочется большей точности. А изучение подробностей/потрохов ОС утомляет без всякой выгоды  Улыбающийся 
Записан
Bepec
Гость
« Ответ #19 : Июнь 26, 2012, 10:56 »

Igors - и какой точности удаётся добиться? Частота обновления то какая?

PS и насколько я понимаю, вы совершаете 2 вызова подряд, если время прошло для 2 вызовов? Тогда смысл в первом вызове для его последующей замены мгновенно вторым?
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #20 : Июнь 26, 2012, 11:04 »

Igors - и какой точности удаётся добиться? Частота обновления то какая?

PS и насколько я понимаю, вы совершаете 2 вызова подряд, если время прошло для 2 вызовов? Тогда смысл в первом вызове для его последующей замены мгновенно вторым?
Наоборот, "не мгновенно". Кадоы показываются с большей частотой если время "убежало вперед". Интервал между ними меньше но не ноль - иначе глаз опознает "разрыв" 
Записан
Alex Custov
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2063


Просмотр профиля
« Ответ #21 : Июнь 26, 2012, 11:34 »

Хокс во первых прав (погрешность та же в 1-15 мс остаётся), это уже виндосовские заморочки.
Во вторых погрешность почему-то отрабатывает раз в какой-то промежуток времени.
Т.е. к примеру 15 сигналов с перерывом в 1-2 мс (), далее неизвестный тормоз на 2-15 мс и продолжаемс..

Ну так это, как уже объяснили, никакой гарантии не даёт и не может дать. твоя задача висела в foreground и успевала отработать несколько таймеров, потом когда планировщик её скинул, интервалы исполнения таймеров существенно увеличились.
Записан
Alex Custov
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2063


Просмотр профиля
« Ответ #22 : Июнь 26, 2012, 11:40 »

Есть выход - собственный таймер, собственное устройство, подключаемое к PCI/USB и собственная ОС реального времени Веселый

Иначе - увы.

А зачем всё собственное, уже давно всё придумано. К тому же, скажем так, это будет трудно сделать в userspace. В Linux на уровне ядра, например, есть значительно более точные таймеры, чем 15 мс.
« Последнее редактирование: Июнь 26, 2012, 11:43 от Alex Custov » Записан
Bepec
Гость
« Ответ #23 : Июнь 26, 2012, 11:54 »

Линукс и виндовс это ... Не буду объяснять что это Улыбающийся

Гарантии дать не может, но для пользователя 15-20 мс роли не играют. Ни в чём. Даже если и будет разрыв, мозг его достроит Улыбающийся

Точнее не, не так. Гарантия ЕСТЬ и БУДЕТ, что разрыв будет максимум 15 мс.

Кстати разрыв таймера и отсчёта времени = есмь одно и то же.

Отсчёт времени - такой же таймер. С такой же погрешностью. И даже если опять набегут критики -переключение между потоками (выделение процессорного времени) ТОЖЕ использует тот же таймер. С такой же погрешностью. Микрософтовцы правда пытаются убрать эту зависимость, но пока тщётно.

Проще выражаясь - как вы не будете мудрить, как вы не будете писать приложение, в виндовсе потоки вашего приложения могут быть спокойно "заморожены" на время этой погрешности.

просто прикол:
Был где то клип, где показывались разные фигуры в движении с разрывами в 20-30 мс. Мозг автоматом достраивает картинку. А вот перематываешь ручками - оппа нету ничего Веселый
Записан
Alex Custov
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2063


Просмотр профиля
« Ответ #24 : Июнь 26, 2012, 12:17 »

Отсчёт времени - такой же таймер. С такой же погрешностью. И даже если опять набегут критики -переключение между потоками (выделение процессорного времени) ТОЖЕ использует тот же таймер. С такой же погрешностью.

Не с такой же. Интервалы в Linux отсчитываются относительно счётчика jiffies, который зависит от вкомпилированного значения HZ, от 100 до 1000. Это значение может использоваться для перепрограммирования аппаратного таймера до более точного значения, чем 18 Hz, а значит, что на задачу может быть использовано вплоть до 1 мс. Опять же, на уровне ядра.

Микрософтовцы правда пытаются убрать эту зависимость, но пока тщётно.

Каким образом, интересно? Созданием нового чипа для плат?
Записан
Bepec
Гость
« Ответ #25 : Июнь 26, 2012, 12:30 »

Во первых - пытаются отказаться от этого чипа.

Во вторых я обсуждаю Windows, а не Linux. Имеете глаза - читайте.
 
PS я могу на своём домашнем ардуино сверхточные прошивки бацать, но простите уж, 98% пользователей на винде.

PPS официальную статистику не смотрите - туда входят только ОФИЦИАЛЬНЫЕ продажи Microsoft "D
Записан
Alex Custov
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2063


Просмотр профиля
« Ответ #26 : Июнь 26, 2012, 14:02 »

Во первых - пытаются отказаться от этого чипа.

В пользу чего?

Во вторых я обсуждаю Windows, а не Linux. Имеете глаза - читайте.

Не знаю что ты обсуждаешь, т.к. ты написал "Линукс и виндовс это ... Не буду объяснять что это", что это значит понятно только тебе, поэтому ниоткуда не следует что ты обсуждаешь исключительно Windows. Тема изначально нацелена на кроссплатформенность, а не Windows.
« Последнее редактирование: Июнь 26, 2012, 14:04 от Alex Custov » Записан
Bepec
Гость
« Ответ #27 : Июнь 26, 2012, 14:14 »

Насчёт линукса и виндовса - это холивар. Бессмысленный и беспощадный. Яблоко с чернозёмом мешают.

Насчёт о кроссплатформенности - почитай 1 пост и поймёшь, что речь идёт о Мультимедиа таймере, который используется только в Windows и спрашивается о "кроссплатформенности" аналога для использования в Windows. Ибо это Windooows Веселый
Не можешь уследить за ходом разговора - извиняюсь тогда, но стоит ли лезть туда, за чем уследить не можешь? Веселый

В пользу чего отказываются - неясно. И не узнаем скорее всего до тех пор, пока не обнародуют решение. Обычные заявления Микрософта - мы откажемся, но вот как - узнаете когда выпустим Веселый
Записан
Alex Custov
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2063


Просмотр профиля
« Ответ #28 : Июнь 26, 2012, 15:53 »

Насчёт о кроссплатформенности - почитай 1 пост и поймёшь, что речь идёт о Мультимедиа таймере, который используется только в Windows и спрашивается о "кроссплатформенности" аналога для использования в Windows. Ибо это Windooows Веселый

Автор сказал, что не хочет писать платформозависимый код, и далее уже нашёл какой-то код для быстрого таймера в Linux, и что хорошо, что пока под Мак не требуется портировать. Если у кого-то проблемы с восприятием текста, так это у тебя. Винду он просто привёл в пример.
Записан
Bepec
Гость
« Ответ #29 : Июнь 26, 2012, 17:12 »

Как известно , в винде есть так называемый мультимедиа таймер, отличие от простого таймера в том, что он выполняется в четко заданные промежутки времени , а не когда освободится система, как в обычном таймере, и в том, что вызываемая в нем callback-функция вызывается в отдельном потоке. Вопрос - понятно что под Qt можно использовать непосредственно сам мультимедиа таймер, но но это получается платформазависимый код. А как реализовать мультимедиа таймер средствами Qt?

Поясняю специально для Густава. Вольный перевод начала темы:

Есть в ОС WINDOWS таймер, который меня устраивает. Его я могу использовать напрямую через WinApi в ОС WINDOWS. Как реализовать аналог Multimedia таймер средствами Qt.

В дальнейшем, он нашёл решение под Linux и вопрос темы перешёл на одну ОС - WINDOWS.

В дальнейшем же, он узнал, что ему нет необходимости утруждать себя - в Qt предусмотрено его использование, в ОС WINDOWS.

Тема уже закрыта, а вы, простите уж, собачитесь тут Улыбающийся
Записан
Страниц: 1 [2] 3   Вверх
  Печать  
 
Перейти в:  


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