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语言使用setjmp和longjmp实现一个简单的协程

    C语言使用setjmp和longjmp实现一个简单的协程

    这篇文章主要为大家介绍了C语言使用setjmp和longjmp实现一个简单的协程过程详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-12-12
  • 基于C语言实现点餐系统

    基于C语言实现点餐系统

    这篇文章主要为大家详细介绍了基于C语言实现点餐系统,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-11-11
  • 基于C语言实现点菜系统

    基于C语言实现点菜系统

    这篇文章主要为大家详细介绍了基于C语言实现点菜系统,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-11-11
  • C++详解多线程中的线程同步与互斥量

    C++详解多线程中的线程同步与互斥量

    线程间如何通信同步?一些伙伴好奇线程间的通信及同步方法,没关系,下面小编就继续给大家科普下线程间通信及同步的方法以及互斥量
    2022-05-05
  • 如何利用OpenGL画坐标轴指示图

    如何利用OpenGL画坐标轴指示图

    C++用opengl绘制出的二维坐标,简单明了,很容易理解,下面这篇文章主要给大家介绍了关于如何利用OpenGL画坐标轴指示图的相关资料,需要的朋友可以参考下
    2022-01-01
  • C语言实现拼图游戏源码

    C语言实现拼图游戏源码

    这篇文章主要为大家详细介绍了C语言实现拼图游戏源码,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-03-03
  • C++ Boost Bimap示例详细讲解

    C++ Boost Bimap示例详细讲解

    Boost是为C++语言标准库提供扩展的一些C++程序库的总称。Boost库是一个可移植、提供源代码的C++库,作为标准库的后备,是C++标准化进程的开发引擎之一,是为C++语言标准库提供扩展的一些C++程序库的总称
    2022-11-11
  • C++如何获取鼠标点击位置

    C++如何获取鼠标点击位置

    这篇文章主要介绍了C++如何获取鼠标点击位置问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-08-08
  • C++利用链表写一个简单的栈实例详解

    C++利用链表写一个简单的栈实例详解

    这篇文章主要介绍了C++利用链表写一个简单的栈实例详解的相关资料,需要的朋友可以参考下
    2017-05-05
  • C++和java设计模式之单例模式

    C++和java设计模式之单例模式

    这篇文章主要为大家详细介绍了C++和java设计模式之单例模式的相关资料,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2016-12-12

最新评论