我正在编写一个QT5和C++的Windows 10中的复杂通信应用程序的计时器。我想使用最大3%的CPU,分辨率为微秒。
最初我在这个应用程序中使用了qTimer(qt5)。它的CPU使用率很低,界面也很友好。但它并不像我需要的那样精确。参数只需要毫秒,但我需要微秒。在很多实际情况下,计时器的精度并不等于这个分辨率,比如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毫秒。