我正在用qt5和c++为windows 10中的复杂通信应用程序编写一个计时器。我想使用最高3%的CPU与微秒分辨率。
最初,我在这个应用程序中使用了qTimer (qt5)。它具有较低的CPU使用率和开发人员友好的界面。但它并不精确,因为我need.It只以毫秒为参数,但我需要微秒。在许多现实世界中,像cpu上的负载一样,定时器的精确度并不等于这个分辨率。有时计时器触发1毫秒,有时15毫秒。您可以在图片中看到这个问题:

我找了好几天的解决办法。但最后我发现Windows是一个非实时操作系统(RTOS),不能提供高分辨率和精确的定时器。
为了实现这个目标,我编写了自己的高分辨率精确计时器和CPU轮询。我开发了一个在单独线程中工作的单例类。它工作在10微秒分辨率。

但是它正在消耗CPU中的一个逻辑核心。相当于2700美元的6.25 %。

对于我的应用程序来说,这种CPU的使用是不可接受的。如何在不泄露高分辨率的情况下减少这个CPU的使用?
这是执行此任务的代码:
void CsPreciseTimerThread::run()
{
while (true)
{
QMutexLocker locker(&mMutex);
for (int i=0;i<mTimerList.size();i++)
{
CsPreciseTimerMiddleLayer* timer = mTimerList[i];
int interval = timer->getInterval();
if ( (timer->isActive() == true&&timer->remainingTime()<0))
{
timer->emitTimeout();
timer->resetTime();
}
}
}
}我试着降低计时线程的优先级。我用了这句话:
QThread::start(QThread::Priority::LowestPriority);这是:
QThread::start(QThread::Priority::IdlePriority);这种变化使得计时器不那么精确,但是CPU的使用并没有减少。
之后,我尝试强制当前线程在循环中休眠几微秒。
QThread::usleep(15);正如你可能猜到的那样,睡眠功能确实影响了准确性。有时计时器的睡眠时间比预期的要长,比如10毫秒或15毫秒。
发布于 2019-04-21 18:47:54
我将直接引用Windows,而不是Qt抽象。
我不认为您想降低线程优先级,我认为您希望提高线程优先级,并在轮询之间使用最小的睡眠量来平衡延迟和CPU开销。
有两个想法:
THREAD_PRIORITY_TIME_CRITICAL。然后在完成睡眠循环之后执行一个非常小的for。这个睡眠量应该在0.10毫秒之间。一些实验需要,但我不会超过一半的时间,直到下一个预期的超时,最大的10毫秒。当你离计时器不到N微秒时,你可能需要旋转而不是屈服。需要进行一些实验。您还可以尝试将进程优先级提高到REALTIME_PRIORITY_CLASS。要小心,-在这些更高优先级的进程和线程中,少数没有休眠的失控进程和线程可以锁定系统。
https://stackoverflow.com/questions/55785357
复制相似问题