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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Простой точный таймер, работает в Windows  (Прочитано 4473 раз)
mezmay
Гость
« : Январь 24, 2014, 13:43 »

Случайно увидел интересную опцию класса 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:
Код
C++ (Qt)
#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-порт и проверяли осциллографом, результат хороший. Иногда проскакивают небольшие сдвиги, но частота пакетов сразу восстанавливается.
« Последнее редактирование: Январь 24, 2014, 13:52 от mezmay » Записан
Fregloin
Супер
******
Offline Offline

Сообщений: 1025


Просмотр профиля
« Ответ #1 : Январь 24, 2014, 14:49 »

на сколько я знаю, винда не есть RTOS и надеяться на такие промежутки таймера не стоит.
Записан
Vamireh
Гость
« Ответ #2 : Январь 24, 2014, 22:24 »

а насколько я знаю винда около 15мс дает точности в лучшем случае... хотя с внешнем тактовым генератором я 1мс делал, но это уже другая история.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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