C++ / Qt 减少循环频率
Posted
技术标签:
【中文标题】C++ / Qt 减少循环频率【英文标题】:C++ / Qt Reduce loop frequency 【发布时间】:2022-01-11 12:59:22 【问题描述】:我需要定期执行一个函数,最大精度为 1ms。但是在 C++/Qt 中,计时器不够精确。例如,当我在 Windows 10 上尝试时,msleep
、usleep
或 nsleep
不能低于 15 毫秒。
所以我决定实现一个while(true)
,其中包含一个QElapsedTimer
。但是while(true)
大约每 20 纳秒执行一次(也许我的测量不是很精确),这占用的 CPU 比我需要的多。每 500µs 执行一次就足够了。
是否有降低循环频率的机制或具有更高线程睡眠精度的库?
怎样才能做到这一点?当然,完美的解决方案是usleep(500)
,但就像我说的,它不适用于 Windows,并且在 Qt 文档中有所报告
注意:此功能不保证准确性。该应用程序可能 在重负载条件下,睡眠时间比 usecs 长。某些操作系统可能 循环使用高达 10 毫秒或 15 毫秒;在 Windows 上,它将被四舍五入到 1 毫秒的倍数。
【问题讨论】:
这能回答你的问题吗? The most accurate timer qt C++ @Passerby 不幸的是,所有带有信号的计时器在您达到低周期时的精度都很差。即使您放置 Qt::PreciseTimer,它也取决于操作系统。这是关于问题的good article,但preciseSleep()
基本上是我的while(true)
,占用的CPU 费用大致相同。
该链接页面的要点是不使用 RTOS 的固有限制。我想您需要更仔细地定义问题。每 500µs ± 什么?
我需要达到 1ms 的精度。所以我可以睡 500µs 或 800µs。我不需要微秒精度的睡眠。但是我测试它需要 15 毫秒。
【参考方案1】:
如果您在 while (true)
循环中调用 QThread::yieldCurrentThread(),您不会看到 CPU 使用率下降,但您的计时线程实际上不会阻止其他线程运行。
【讨论】:
以上是关于C++ / Qt 减少循环频率的主要内容,如果未能解决你的问题,请参考以下文章
qt 循环函数都有哪些?像c语言的for while类似的那种?