Случайно увидел интересную опцию класса
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-порт и проверяли осциллографом, результат хороший. Иногда проскакивают небольшие сдвиги, но частота пакетов сразу восстанавливается.