Qt定时器的精度问题

一、场景

一个网络音频采集场景如下:

数据发送端:嵌入式设备按照16kHz 16Bit连续不断采集音频数据,通过Socket进行发送

数据接受端:QT上位机开一个tcpserver,数据readReady后由QByteArray进行追加,音频波形显示开了一个定时器,每100ms去取QByteArray指定长度(16K*0.1*2),并remove该数据。

打印结果发现,QByteArray的数据越来越多,说明接受数据和取数据的速度没匹配。

日志:

二、分析

数据发送端是用的实时系统,音频采集的数据发送频率不会出现问题,那应该是QT上位机定时器的精度不到,定时器出现误差才会出现FIFO不断增长。

经过了解,QTimer的精度确实不太够,默认构造为Qt::CoarseTimer,粗略定时精度在正负5%。另一方面,windows不是实时系统,时间片轮转调度也会导致定时器的误差。

提高QTimer的精度,可以使用setTimerType(Qt::PreciseTimer),性能会好些。

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Qt中的定时器是一种常用的机制,可以用于周期性执行特定的代码块。Qt提供了多种类型的定时器,其中使用 QTimer 类可以使用毫秒级别的定时器,但是这种定时器的最小精度只能达到1ms,而有时候我们需要更高精度定时器。 针对这个问题,我们可以使用 Qt 的 QElapsedTimer 类来实现更高精度定时器。QElapsedTimer 类是一个简单易用的高精度计时器,精度可以达到纳秒级别。我们可以利用该类来实现 10ms 定时器,实现方法如下: - 使用 QTimer 类创建一个 1ms 定时器,每次到达时间时触发一个 signal。 - 在 signal 的槽函数里,获取当前时间,并使用 QElapsedTimer 类的 elapsed() 方法来计算时间差。 - 根据时间差判断是否已经到达 10ms,如果是,则执行我们需要的代码块。 - 否则,继续等待 1ms 定时器下一次的触发。 下面是对应的示例代码: ```cpp QTimer* timer = new QTimer(this); connect(timer, &QTimer::timeout, this, &MyClass::onTimerTimeout); timer->start(1); QElapsedTimer elapsedTimer; elapsedTimer.start(); void MyClass::onTimerTimeout() { qint64 elapsedTime = elapsedTimer.nsecsElapsed(); if (elapsedTime >= 10000000) { // 10ms // 执行需要的操作 elapsedTimer.restart(); } } ``` 通过上述方法,我们就可以实现更高精度定时器,从而尽可能地避免了由于定时器精度不够而引起的问题。 ### 回答2: QT是一种非常实用的跨平台开发框架,提供了许多非常实用的工具类和库,QT精度10ms定时器就是其中一种。 在QT中,定时器可以用来完成一些需要定时执行的任务,比如轮询什么事件或者周期更新一些数据。而对于有些应用场景需要更高的精度,正是QT精度10ms定时器发挥作用的时候了。 在使用QT精度10ms定时器时,我们可以通过QTimer来进行设置和调用。首先,我们需要创建一个QTimer实例,并设置计时器时间间隔为10毫秒。然后,我们将时间间隔与所执行的操作绑定在一起,并启动计时器即可。 在使用QT精度10ms定时器时,需要注意以下几点: 1. 由于定时器的计时是基于系统时间的,因此应当注意避免程序被其他的系统进程或者线程影响而导致计时器出现偏差。 2. 由于定时器的时间间隔比较短,因此在执行操作时要尽可能保证操作的时间较短,避免出现计时器被卡死的情况。 3. 对于涉及到多线程或者多进程的操作,需要进行合理的处理,避免出现线程安全或者进程冲突的情况。 在实际应用中,QT精度10ms定时器可以广泛应用于各种类型的应用场景,如定时器更新UI界面、控制机器人轮式运动、音频、视频等等。总的来说,QT精度10ms定时器可以有效地提高应用程序的性能和精度

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值