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);
}

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

相关文章

  • C++代码实现链队列详解

    C++代码实现链队列详解

    下面小编就为大家分享一篇C++代码实现链队列的示例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧,希望能够给你带来帮助
    2021-09-09
  • C语言数组实现学生信息管理系统设计

    C语言数组实现学生信息管理系统设计

    这篇文章主要为大家详细介绍了C语言数组实现学生信息管理系统设计,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-01-01
  • C/C++模拟实现烟花效果的示例代码

    C/C++模拟实现烟花效果的示例代码

    这篇文章主要为大家详细介绍了C/C++模拟实现烟花效果的两种简单方法,文中的示例代码讲解详细,具有一定的借鉴价值,感兴趣的小伙伴可以了解下
    2024-01-01
  • C++实现基数排序的方法详解

    C++实现基数排序的方法详解

    本篇文章是对使用C++实现基数排序的方法进行了详细的分析介绍,需要的朋友参考下
    2013-05-05
  • C语言非递归算法解决快速排序与归并排序产生的栈溢出

    C语言非递归算法解决快速排序与归并排序产生的栈溢出

    上期我们讲完了排序算法下,不知道小伙伴们有没有发现一个问题,快速排序和归并排序我们都是用递归来实现的,可能有小伙伴会问,如果说数据量很多话,栈区空间会不会不够用呢?这期我们就来解决使用递归实现的排序导致栈溢出如何解决
    2022-04-04
  • C语言实现餐饮管理与点餐系统

    C语言实现餐饮管理与点餐系统

    这篇文章主要为大家详细介绍了C语言实现餐饮管理与点餐系统,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-01-01
  • 判断一个无向图是否为连通图的方法

    判断一个无向图是否为连通图的方法

    今天小编就为大家分享一篇关于判断一个无向图是否为连通图的方法,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2019-03-03
  • 二叉树入门和刷题详解

    二叉树入门和刷题详解

    这篇文章主要介绍了二叉树入门和刷题详解的相关资料,需要的朋友可以参考下
    2023-07-07
  • C++数据精度问题的解决方案(对浮点数保存指定位小数)

    C++数据精度问题的解决方案(对浮点数保存指定位小数)

    对浮点数保存指定位小数,怎么解决这个问题呢?如果有小伙伴对C++数据精度问题的解决方案感兴趣的朋友一起看看吧
    2017-08-08
  • C++ 排序插入排序实例详解

    C++ 排序插入排序实例详解

    这篇文章主要介绍了C++ 排序插入排序实例详解的相关资料,需要的朋友可以参考下
    2017-06-06

最新评论