Russian Qt Forum

Qt => Общие вопросы => Тема начата: mezmay от Январь 24, 2014, 13:43



Название: Простой точный таймер, работает в Windows
Отправлено: mezmay от Январь 24, 2014, 13:43
Случайно увидел интересную опцию класса QTimer - свойство timerType.
http://qt-project.org/doc/qt-5.0/qtcore/qt...#timerType-prop (http://"http://qt-project.org/doc/qt-5.0/qtcore/qtimer.html#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-порт и проверяли осциллографом, результат хороший. Иногда проскакивают небольшие сдвиги, но частота пакетов сразу восстанавливается.


Название: Re: Простой точный таймер, работает в Windows
Отправлено: Fregloin от Январь 24, 2014, 14:49
на сколько я знаю, винда не есть RTOS и надеяться на такие промежутки таймера не стоит.


Название: Re: Простой точный таймер, работает в Windows
Отправлено: Vamireh от Январь 24, 2014, 22:24
а насколько я знаю винда около 15мс дает точности в лучшем случае... хотя с внешнем тактовым генератором я 1мс делал, но это уже другая история.