首先测试以下qt定时器的精确度
运行结果:timer: 5999 *10 ms
elapsed: 59996
结论:1min的延迟后,误差在6ms内
如果你在 Timeout 槽函数中执行耗时操作,这将会影响定时器的精确性和响应性。
具体来说,Qt 的事件循环是基于单线程模型的,所有事件处理(包括定时器超时事件)都在主线程中进行。
如果 handleTimeout 槽函数中包含耗时操作,那么这段时间内主线程会被阻塞,无法处理其他事件,包括其他定时器事件和用户界面更新。
.h
#ifndef MYWINDOWS_H
#define MYWINDOWS_H
#include <QElapsedTimer>
#include <qtimer.h>
#include <QObject>
class mywindows : public QObject
{
Q_OBJECT
public:
explicit mywindows(QObject *parent = nullptr);
private:
QTimer* timer;
QElapsedTimer elapsedTimer;
int clock_count;
qint64 elapsed;
signals:
void sign_stop();
public slots:
void handleTimeout();
void stopTimer();
};
#endif // MYWINDOWS_H
.cpp
#include "mywindows.h"
#include "qdebug.h"
mywindows::mywindows(QObject *parent) : QObject(parent)
, clock_count(0)
, elapsed(0)
{
timer=new QTimer(this);
elapsedTimer.start();
connect(timer, &QTimer::timeout, this, &mywindows::handleTimeout);
connect(this,&mywindows::sign_stop,this,&mywindows::stopTimer);
timer->start(10); // 设置定时器间隔为10毫秒
elapsed= elapsedTimer.elapsed();
}
void mywindows::handleTimeout()
{
++clock_count;
}
void mywindows::stopTimer()
{
elapsed=elapsedTimer.elapsed()-elapsed;
timer->stop();
qDebug()<<"timer:"<<clock_count <<"*10 ms";
qDebug()<<"elapsed: "<<elapsed;
}
main.cpp
#include <QCoreApplication>
#include <QTimer>
#include <qdebug.h>
#include "mywindows.h"
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
// 创建 MainWindow 实例
mywindows mainWindow;
//mainWindow.show(); // 显示主窗口
// 延迟 60 秒
QEventLoop loop;
QTimer::singleShot(60 * 1000, &loop, &QEventLoop::quit);
loop.exec();
// 发射 sign_stop 信号
emit mainWindow.sign_stop();
int val=a.exec();
return val;
}
标签:定时器,qt,void,mywindows,timer,elapsed,include
From: https://www.cnblogs.com/light-LifeClub/p/18547459