Qt實(shí)現(xiàn)高精度定時(shí)器
一般而言,Qt有兩種使用定時(shí)器的方式, QObject和QTimer,對(duì)于第一種需要重寫(xiě)timerEvent事件來(lái)實(shí)現(xiàn),第二種需要聲明一個(gè)QTimer的對(duì)象或指針,用QTimer::timeout()信號(hào)連接槽函數(shù),設(shè)置定時(shí)器類(lèi)型mTimer.setTimerType(Qt::PreciseTimer);
第一種即使高精度的定時(shí)器,保持毫秒級(jí)別;第二種粗計(jì)時(shí)器盡量將精度保持在所需間隔的5%以?xún)?nèi);第三種非常粗糙的計(jì)時(shí)器只能保持完整的秒精度.
#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"; }
下面分別展示三種類(lèi)型的時(shí)間間隔:
Qt::PreciseTimer:
Qt::CoarseTimer:
Qt::VeryCoarseTimer:
顯而易見(jiàn),第一種的精度最高,但偶爾也會(huì)超過(guò)20ms,對(duì)于一些實(shí)時(shí)性較高的通訊來(lái)說(shuō),還是達(dá)不到要求.使用線程加延時(shí)能達(dá)到最多正負(fù)1ms的誤差,一下輸出我使用的是10ms一個(gè)周期:
現(xiàn)在也貼上代碼:
#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); }
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
C++中const的實(shí)現(xiàn)機(jī)制深入分析
C語(yǔ)言以及C++語(yǔ)言中的const究竟表示什么?其具體的實(shí)現(xiàn)機(jī)制又是如何實(shí)現(xiàn)的呢?本文將對(duì)這兩個(gè)問(wèn)題進(jìn)行一些分析,需要了解的朋友可以參考下2012-12-12如何在 clion 運(yùn)行多個(gè) main 函數(shù)(方法詳解)
這篇文章主要介紹了如何在 clion 運(yùn)行多個(gè) main 函數(shù),本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-08-08詳細(xì)解析命令行的getopt_long()函數(shù)
getopt_long支持長(zhǎng)選項(xiàng)的命令行解析,函數(shù)中的參數(shù)argc和argv通常直接從main()的兩個(gè)參數(shù)傳遞而來(lái)2013-09-09IOS 開(kāi)發(fā)UITextView回收或關(guān)閉鍵盤(pán)
這篇文章主要介紹了IOS 開(kāi)發(fā)UITextView回收或關(guān)閉鍵盤(pán)的相關(guān)資料,需要的朋友可以參考下2017-06-06純C語(yǔ)言:貪心Prim算法生成樹(shù)問(wèn)題源碼分享
這篇文章主要介紹了貪心Prim算法生成樹(shù)問(wèn)題源碼,有需要的朋友可以參考一下2014-01-01C語(yǔ)言中的for循環(huán)語(yǔ)句基本語(yǔ)法及使用
這篇文章主要介紹了C語(yǔ)言中的for循環(huán)語(yǔ)句基本語(yǔ)法及使用,本文結(jié)合實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-06-06