msleep()会产生不准确的睡眠间隔QT

  • 本文关键字:QT 不准确 msleep c++ qt qt5
  • 更新时间 :
  • 英文 :


有一个更大的项目,数据包必须一个接一个地延迟发送,加上睡眠量非常少,大约为1ms。但是CCD_ 1进行到非常随机且准确的结果。

比方说,在10次循环中,每个循环上都有msleep(1),我们预计从9ms(这应该是不可能的(到33ms的接收时间将为10.5ms。

QElapsedTimer time;
time.start();
while(f<11){
qDebug("looping...");
f++;
msleep(1); //or msleep(10) produces same result.
}
qDebug() << time.elapsed();

现在,在上面的片段中,我们预计接收时间为10ms,从165ms到175ms,与msleep(10)的结果相同,这肯定不会发生。

现在考虑到我需要在1毫秒左右停下来,我们非常感谢您的帮助。

PS。我在谷歌上搜索了很多,但只进入了beginTimePeriod(),我不确定它是否与QT兼容,以及它如何使用

我不知道你在哪个平台上,但现在可能会出现奇怪的结果。

未加载的计算机的性能将比加载的计算机差,因为在这种情况下,只有低功率/性能核心处于活动状态,或者您的高功率核心处于休眠状态,必须唤醒。

我们也可以怀疑time.elapsd((给出的结果,但我们假设它是正确的。

通过查看一些nanosleep(…(文档(其中声明了msleep(((,我们被邀请使用pthread条件变量。

在一个完全没有加载的Mac mini M1上,一个cv.wait_until(…(和一个QThread::msleep(10u(在12毫秒时执行相同的时间报告。elapsed((

就像在你的例子中一样,在9ms(你在系统上也看到的(上报告了10次迭代cv.wait_until(…(

QThread::msleep(100u(在125 ms时报告,而迭代cv.wait_until(…(在99 ms 时报告

我的MCVE只是为了保存这个想法(我的Qt非常生疏,我使用了std条件变量(:

#include <QCoreApplication>
#include <QElapsedTimer>
#include <QThread>
#include <chrono>
#include <condition_variable>
std::condition_variable cv;
std::mutex cv_m;
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
QElapsedTimer time;
time.start();
unsigned int tempo = 10u;
//the clock with the shortest tick period available
auto beginning = std::chrono::high_resolution_clock::now();
for (unsigned int k=0;k<tempo;k++) {
#if 1
auto timepoint = beginning + std::chrono::milliseconds(k);
std::unique_lock<std::mutex> lk(cv_m);
while( std::cv_status::timeout  != cv.wait_until(lk,timepoint )){}
#else
QThread::msleep(1u);
#endif
}
qDebug() << time.elapsed();
return a.exec();
}

相关内容

  • 没有找到相关文章

最新更新