首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何降低高分辨率(10微秒)精密定时器的CPU使用量?

问如何降低高分辨率(10微秒)精密定时器的CPU使用量?
EN

Stack Overflow用户
提问于 2019-04-21 18:05:53
回答 1查看 738关注 0票数 0

我正在用qt5和c++为windows 10中的复杂通信应用程序编写一个计时器。我想使用最高3%的CPU与微秒分辨率。

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

​

​

我找了好几天的解决办法。但最后我发现Windows是一个非实时操作系统(RTOS),不能提供高分辨率和精确的定时器。

为了实现这个目标,我编写了自己的高分辨率精确计时器和CPU轮询。我开发了一个在单独线程中工作的单例类。它工作在10微秒分辨率。

​

​

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

​

​

对于我的应用程序来说,这种CPU的使用是不可接受的。如何在不泄露高分辨率的情况下减少这个CPU的使用?

这是执行此任务的代码:

代码语言:javascript
复制
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();
        }
    }



}
}

我试着降低计时线程的优先级。我用了这句话:

代码语言:javascript
复制
QThread::start(QThread::Priority::LowestPriority);

这是:

代码语言:javascript
复制
QThread::start(QThread::Priority::IdlePriority);

这种变化使得计时器不那么精确,但是CPU的使用并没有减少。

之后,我尝试强制当前线程在循环中休眠几微秒。

代码语言:javascript
复制
QThread::usleep(15);

正如你可能猜到的那样,睡眠功能确实影响了准确性。有时计时器的睡眠时间比预期的要长,比如10毫秒或15毫秒。

EN

回答 1

Stack Overflow用户

发布于 2019-04-21 18:47:54

我将直接引用Windows,而不是Qt抽象。

我不认为您想降低线程优先级,我认为您希望提高线程优先级,并在轮询之间使用最小的睡眠量来平衡延迟和CPU开销。

有两个想法:

  1. 在Windows中,他们专门引入了多媒体类调度服务,这样他们就可以将Windows音频组件移出内核模式,在用户模式下运行,而不会影响支持音频的工具。这可能会对你有帮助--它不是严格的“实时”保护,但它适用于低延迟操作。
  2. 采用经典的方法--将进程和线程优先级提高到高或关键,同时使用几毫秒的合理睡眠语句。也就是说,将您的线程优先级提高到THREAD_PRIORITY_TIME_CRITICAL。然后在完成睡眠循环之后执行一个非常小的for。这个睡眠量应该在0.10毫秒之间。一些实验需要,但我不会超过一半的时间,直到下一个预期的超时,最大的10毫秒。当你离计时器不到N微秒时,你可能需要旋转而不是屈服。需要进行一些实验。您还可以尝试将进程优先级提高到REALTIME_PRIORITY_CLASS。

要小心,-在这些更高优先级的进程和线程中,少数没有休眠的失控进程和线程可以锁定系统。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55785357

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档