crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

 
Ответить в данную темуНачать новую тему
> Простой точный таймер, работает в Windows, использование PreciseTimer
mezmay
  опции профиля:
сообщение 24.1.2014, 13:09
Сообщение #1


Активный участник
***

Группа: Участник
Сообщений: 272
Регистрация: 13.7.2009
Из: Ростов-на-Дону
Пользователь №: 904

Спасибо сказали: 16 раз(а)




Репутация:   1  


Случайно увидел интересную опцию класса QTimer - свойство timerType.
http://qt-project.org/doc/qt-5.0/qtcore/qt...#timerType-prop
Оно может принимать значения:
Цитата
enum Qt::TimerType
The timer type indicates how accurate a timer can be.

Qt::PreciseTimer 0 Precise timers try to keep millisecond accuracy
Qt::CoarseTimer 1 Coarse timers try to keep accuracy within 5% of the desired nterval
Qt::VeryCoarseTimer 2 Very coarse timers only keep full second accuracy

По умолчанию при создании объекта класса QTimer используется значение Qt::CoarseTimer, то есть грубый таймер, в Windows - обычный таймер.

Для использования точного таймера надо выбрать Qt::PreciseTimer, и тогда в Windows будет при возможности использоваться Multimedia timer.

Простой рабочий пример на Qt 5.1:
Раскрывающийся текст
#include <QCoreApplication>
#include <QTimer>
#include <QTime>
#include <QFile>

void on_timer();

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    QTimer tm;
    tm.setTimerType(Qt::PreciseTimer);

    QObject::connect(&tm, &QTimer::timeout, on_timer);
    tm.start(10);

    return a.exec();
}

static void on_timer()
{
    static QFile file("log.txt");
    static bool tmp = file.open(QIODevice::WriteOnly);

    QString str = QTime::currentTime().toString("hh:mm:ss.zzz") + '\n';
    file.write(str.toLocal8Bit());    
}


Таймер был проверен в Windows 7 x64: по таймеру мы писали данные в COM-порт и проверяли осциллографом, результат хороший. Иногда проскакивают небольшие сдвиги, но частота пакетов сразу восстанавливается.

Сообщение отредактировал mezmay - 24.1.2014, 13:16
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 24.1.2014, 14:28
Сообщение #2


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


вообще это давняя легенда: использование COM-порта и некого точного таймера.
Т.к. таймер к программе никакой жёсткой привязки не имеет.
Когда очередь событий виндовоза дойдёт до твоего приложения, только тогда оно отреагирует, не раньше не позже.

И эти интервалы времени сильно зависят от работы других программ.
У меня например когда Аська стартует, она при мерно на полсекунды "глушит" работу многих программ.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Iron Bug
  опции профиля:
сообщение 28.1.2014, 6:59
Сообщение #3


Профессионал
*****

Группа: Модератор
Сообщений: 1611
Регистрация: 6.2.2009
Из: Yekaterinburg
Пользователь №: 533

Спасибо сказали: 219 раз(а)




Репутация:   12  


Цитата(Litkevich Yuriy @ 24.1.2014, 17:28) *
Т.к. таймер к программе никакой жёсткой привязки не имеет.
Когда очередь событий виндовоза дойдёт до твоего приложения, только тогда оно отреагирует, не раньше не позже.

И эти интервалы времени сильно зависят от работы других программ.
У меня например когда Аська стартует, она при мерно на полсекунды "глушит" работу многих программ.


именно поэтому не надо в риалтайм приложениях использовать вендозные события: они слишком тормозные и весь эффект риалтайма просто потеряется.
а что касается "зависимости" от работы других программ - это лишь вопрос приоритетов. выше стоят только драйверы. венда сильно тормозит, когда начинается обмен по сети. если вырубить у неё сеть - она работает гораздо быстрее.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 29.11.2024, 14:04