C++ / Qt 减少循环频率

Posted

技术标签:

【中文标题】C++ / Qt 减少循环频率【英文标题】:C++ / Qt Reduce loop frequency 【发布时间】:2022-01-11 12:59:22 【问题描述】:

我需要定期执行一个函数,最大精度为 1ms。但是在 C++/Qt 中,计时器不够精确。例如,当我在 Windows 10 上尝试时,msleepusleepnsleep 不能低于 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类似的那种?

FFT 和改变频率并矢量化 FOR 循环

多重循环编码规

如何使循环计算更快

Cocoa:将 NSApplication 集成到现有的 c++ 主循环中

在for循环c ++中计算出现次数