Qt实现高精度定时器

 更新时间:2022年08月04日 16:30:51   作者:_____C  
这篇文章主要为大家详细介绍了Qt实现高精度定时器,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

一般而言,Qt有两种使用定时器的方式, QObject和QTimer,对于第一种需要重写timerEvent事件来实现,第二种需要声明一个QTimer的对象或指针,用QTimer::timeout()信号连接槽函数,设置定时器类型mTimer.setTimerType(Qt::PreciseTimer);

第一种即使高精度的定时器,保持毫秒级别;第二种粗计时器尽量将精度保持在所需间隔的5%以内;第三种非常粗糙的计时器只能保持完整的秒精度.

#ifndef BACKENDPROIXY_H
#define BACKENDPROIXY_H
 
#include <QObject>
#include <QTimer>
#include <QTime>
 
class BackendProxy : public QObject
{
    Q_OBJECT
public:
    explicit BackendProxy(QObject *parent = nullptr);
 
signals:
private slots:
    void onTimeOut();
private:
    QTimer mTimer;
    QTime lastTime;
 
};
 
#endif // BACKENDPROIXY_H
#include "backendproixy.h"
 
#include <QDebug>
 
BackendProxy::BackendProxy(QObject *parent) : QObject(parent)
{
    connect(&mTimer,&QTimer::timeout,this,&BackendProxy::onTimeOut);
    mTimer.setTimerType(Qt::PreciseTimer);
    mTimer.start(50);
}
 
 
void BackendProxy::onTimeOut()
{
    QTime currentTime;
    int elapsed = 0;
    if(lastTime == QTime()){
        lastTime = QTime::currentTime();
    }else{
        currentTime = QTime::currentTime();
        elapsed = lastTime.msecsTo(currentTime);
        lastTime = QTime::currentTime();
    }
    qDebug()<<"Run.elapsed ="<<elapsed<<"ms";
}

下面分别展示三种类型的时间间隔:

Qt::PreciseTimer:

Qt::CoarseTimer:

Qt::VeryCoarseTimer:

显而易见,第一种的精度最高,但偶尔也会超过20ms,对于一些实时性较高的通讯来说,还是达不到要求.使用线程加延时能达到最多正负1ms的误差,一下输出我使用的是10ms一个周期:

现在也贴上代码:

#ifndef PERFORMANCEFREQUENCY_H
#define PERFORMANCEFREQUENCY_H
 
#include<QThread>
#include<QDebug>
#include<QUdpSocket>
#include <QHostAddress>
 
 
#define SEND_TIME 10
 
class PerformanceFrequency : public QThread
{
    Q_OBJECT
public:
    explicit PerformanceFrequency(QObject *parent = nullptr);
    void setThreadRunning(bool start){bRunning = start;}
    void appendByte(QByteArray array);
    void removeOneByte(QByteArray array);
signals:
    void sendJaguarJointControl(QByteArray ba);
    void heartTime(int time);
protected:
    void run() override;
private:
    QList<QByteArray> listByte;
    bool bRunning = true;
 
};
 
#endif // PERFORMANCEFREQUENCY_H
#include "performancefrequency.h"
#include <QTime>
 
#include <QMutex>
#include <QMutexLocker>
 
PerformanceFrequency::PerformanceFrequency(QObject *parent)
    : QThread(parent)
{
    QByteArray heart;
    heart[0] = 0xf0;
    heart[1] = heart[2] = heart[3] = heart[4] = heart[5] = heart[6] = heart[7] =  0;
    listByte.append(heart);
}
 
void PerformanceFrequency::run()
{
    while(bRunning){
        QTime startTime = QTime::currentTime();
        msleep(SEND_TIME);
        for(int i = 0;i < listByte.size();i++){
            emit sendJaguarJointControl(listByte.at(i));
        }
 
        QTime stopTime = QTime::currentTime();
        int elapsed = startTime.msecsTo(stopTime);
        emit heartTime(elapsed);
        qDebug()<<"Run.elapsed ="<<elapsed<<"ms";
    }
}
 
void PerformanceFrequency::appendByte(QByteArray array)
{
    static QMutex mutex;
    QMutexLocker locker(&mutex);
    listByte.append(array);
}
void PerformanceFrequency::removeOneByte(QByteArray array)
{
    static QMutex mutex;
    QMutexLocker locker(&mutex);
    listByte.removeOne(array);
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • QT通过C++线程池运行Lambda自定义函数流程详解

    QT通过C++线程池运行Lambda自定义函数流程详解

    最近在接触公司的一个QT桌面项目,其中里面有一个模块是使用线程池去运行自定义函数的,自己潜心研究那个线程池代码一天,发现研究不透,看不懂,里面几乎都是使用C++11的新特性进行编写
    2022-10-10
  • 深度解析C语言中数据的存储

    深度解析C语言中数据的存储

    本文详细介绍了C语言中数据的存储,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-05-05
  • 关于C++的强制类型转换浅析

    关于C++的强制类型转换浅析

    C++的强制类型转换是我们在日常开发中经常会遇到的,下面这篇文章主要给大家介绍了关于C++强制类型转换的相关资料,文中通过示例代码介绍的非常详细,需要的朋友可以参考借鉴,下面随着小编来一起学习学习吧。
    2017-09-09
  • 数据结构之矩阵行列和相等的实例

    数据结构之矩阵行列和相等的实例

    这篇文章主要介绍了数据结构之矩阵行列和相等的实例的相关资料,希望通过本文能帮助到大家,让大家掌握这部分内容,需要的朋友可以参考下
    2017-10-10
  • C语言实现矩阵翻转(上下翻转、左右翻转)

    C语言实现矩阵翻转(上下翻转、左右翻转)

    这篇文章主要介绍了C语言实现矩阵翻转(上下翻转、左右翻转)的相关资料,需要的朋友可以参考下
    2017-05-05
  • 一文带你掌握C++中的移动语义和完美转发

    一文带你掌握C++中的移动语义和完美转发

    这篇文章主要为大家详细介绍了C++中的移动语义和完美转发的相关知识,文中的示例代码讲解详细,对我们深入掌握C++有一定的帮助,感兴趣的小伙伴可以跟随小编一起学习一下
    2023-12-12
  • c++ error:crosses initialization of问题解决分析

    c++ error:crosses initialization of问题解决分析

    这篇文章主要介绍了c++ error:crosses initialization ofde 问题解决分析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-08-08
  • C语言利用UDP实现群聊聊天室的示例代码

    C语言利用UDP实现群聊聊天室的示例代码

    UDP是一个轻量级、不可靠、面向数据报的、无连接的传输层协议,多用于可靠性要求不严格,不是非常重要的传输,如直播、视频会议等等。本文将利用UDP实现简单的群聊聊天室,感兴趣的可以了解一下
    2022-08-08
  • 使用C++绘制GDI位图的基本编写实例

    使用C++绘制GDI位图的基本编写实例

    这篇文章主要介绍了使用C++绘制GDI位图的基本编写实例,一般来说适用于Windwos下的C++的GUI编程,需要的朋友可以参考下
    2015-12-12
  • C++面向对象中构造函数使用详解

    C++面向对象中构造函数使用详解

    学习过C语言的小伙伴知道:C语言是面向过程的,关注的是过程,分析出求解问题的步骤,通过函数调用逐步解决问题,这篇文章主要介绍了C++面向对象中构造函数使用
    2022-10-10

最新评论