qt定时器

首先测试以下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;
}

posted on   不败剑坤  阅读(42)  评论(0编辑  收藏  举报

相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧

导航

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5
点击右上角即可分享
微信分享提示