一个网络音频采集场景如下:
数据发送端:嵌入式设备按照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),性能会好些。
定时器
的
精度
取决于底层操作系统和硬件。绝大多数平台支持
精度
为1毫秒,尽管
定时器
的准确性在许多现实世界的情况下和这不相符。
准确性也取决于
定时器
类型(
Qt
::T
imer
Type)。对于
Qt
::PreciseT
imer
来说,
QT
imer
将试图保持精确度在1毫秒。精确的
定时器
也从来不会比预计的还要早超时。
对于
Qt
::CoarseT
imer
和
Qt
::VeryCoarseT
imer
类型,
QT
i
最近在实现定时采集气象传感器的数据。在软件实现方面,用Py
Qt
5框架的
QT
imer
实现定时读取传感器信息,但在做测试实验的过程中发现
QT
imer
的
精度
误差太大,原计划每1秒读一次数据,随着时间的延长,无法实现精确度为1s的读取。
因此在网上找到了解决办法。下面给出python代码以及测试结果。
from Py
Qt
5.
Qt
Core import
QT
imer
import datet...
### 回答1:
Qt
中的
定时器
是一种常用的机制,可以用于周期性执行特定的代码块。
Qt
提供了多种类型的
定时器
,其中使用
QT
imer
类可以使用毫秒级别的
定时器
,但是这种
定时器
的最小
精度
只能达到1ms,而有时候我们需要更高
精度
的
定时器
。
针对这个
问题
,我们可以使用
Qt
的 QElapsedT
imer
类来实现更高
精度
的
定时器
。QElapsedT
imer
类是一个简单易用的高
精度
计时器,
精度
可以达到纳秒级别。我们可以利用该类来实现 10ms
定时器
,实现方法如下:
- 使用
QT
imer
类创建一个 1ms
定时器
,每次到达时间时触发一个 signal。
- 在 signal 的槽函数里,获取当前时间,并使用 QElapsedT
imer
类的 elapsed() 方法来计算时间差。
- 根据时间差判断是否已经到达 10ms,如果是,则执行我们需要的代码块。
- 否则,继续等待 1ms
定时器
下一次的触发。
下面是对应的示例代码:
```cpp
QT
imer
* t
imer
= new
QT
imer
(this);
connect(t
imer
, &
QT
imer
::timeout, this, &MyClass::onT
imer
Timeout);
t
imer
->start(1);
QElapsedT
imer
elapsedT
imer
;
elapsedT
imer
.start();
void MyClass::onT
imer
Timeout()
qint64 elapsedTime = elapsedT
imer
.nsecsElapsed();
if (elapsedTime >= 10000000) { // 10ms
// 执行需要的操作
elapsedT
imer
.restart();
通过上述方法,我们就可以实现更高
精度
的
定时器
,从而尽可能地避免了由于
定时器
精度
不够而引起的
问题
。
### 回答2:
QT
是一种非常实用的跨平台开发框架,提供了许多非常实用的工具类和库,
QT
高
精度
10ms
定时器
就是其中一种。
在
QT
中,
定时器
可以用来完成一些需要定时执行的任务,比如轮询什么事件或者周期更新一些数据。而对于有些应用场景需要更高的
精度
,正是
QT
高
精度
10ms
定时器
发挥作用的时候了。
在使用
QT
高
精度
10ms
定时器
时,我们可以通过
QT
imer
来进行设置和调用。首先,我们需要创建一个
QT
imer
实例,并设置计时器时间间隔为10毫秒。然后,我们将时间间隔与所执行的操作绑定在一起,并启动计时器即可。
在使用
QT
高
精度
10ms
定时器
时,需要注意以下几点:
1. 由于
定时器
的计时是基于系统时间的,因此应当注意避免程序被其他的系统进程或者线程影响而导致计时器出现偏差。
2. 由于
定时器
的时间间隔比较短,因此在执行操作时要尽可能保证操作的时间较短,避免出现计时器被卡死的情况。
3. 对于涉及到多线程或者多进程的操作,需要进行合理的处理,避免出现线程安全或者进程冲突的情况。
在实际应用中,
QT
高
精度
10ms
定时器
可以广泛应用于各种类型的应用场景,如
定时器
更新UI界面、控制机器人轮式运动、音频、视频等等。总的来说,
QT
高
精度
10ms
定时器
可以有效地提高应用程序的性能和
精度
。