有一个更大的项目,数据包必须一个接一个地延迟发送,加上睡眠量非常少,大约为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();
}