首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >c++ while循环计时器精度变化很大

c++ while循环计时器精度变化很大
EN

Stack Overflow用户
提问于 2019-04-24 03:24:39
回答 2查看 278关注 0票数 0

我正在尝试使用while循环来创建一个计时器,该计时器可以持续测量3000μs (3ms),虽然它大部分时间都可以工作,但有时计时器可能会延迟500μs。为什么会发生这种情况?有没有更精确的方法来制作这样的计时器?

代码语言:javascript
复制
int getTime() {
    chrono::microseconds μs = chrono::duration_cast< chrono::microseconds >(
        chrono::system_clock::now().time_since_epoch() //Get time since last epoch in μs
        );
    return μs.count(); //Return as integer
}

int main()
{
    int target = 3000, difference = 0;
    while (true) {
        int start = getTime(), time = start;
        while ((time-start) < target) {
            time = getTime();
        }
        difference = time - start;
        if (difference - target > 1) { //If the timer wasn't accurate to within 1μs
            cout << "Timer missed the mark by " + to_string(difference - target) + " microseconds" << endl; //Log the delay
        }
    }
    return 0;
}

我希望这段代码记录的延迟始终在5μs以内,但不是the console output looks like this

编辑以澄清:我在Windows10Enterprise Build 16299上运行,但该行为在Debian虚拟机上仍然存在。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-04-24 03:28:50

您还需要考虑其他正在运行的进程。操作系统可能会抢占您的进程,以便将CPU时间分配给其他进程/线程,并且不确定地将控制权返回给运行此计时器的进程/线程。

当然,当我们考虑实时操作系统或平面调度器时,这并不是100%正确的。但是,如果您在一台通用机器上运行,那么在您的代码中很可能就是这种情况。

票数 1
EN

Stack Overflow用户

发布于 2019-04-24 03:32:46

由于您在Windows上运行,RTOS负责通过NTP计时,因为C++没有内置函数。查看这个用于SetTimer()函数的Windows API:http://msdn.microsoft.com/en-us/library/ms644906(v=vs.85).aspx

如果您想通过C++获得最佳和最高分辨率的时钟,请查看chrono库:

代码语言:javascript
复制
#include <iostream>
#include <chrono>
#include "chrono_io"

int main()
{
    typedef std::chrono::high_resolution_clock Clock;
    auto t1 = Clock::now();
    auto t2 = Clock::now();
    std::cout << t2-t1 << '\n';
}
票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55818106

复制
相关文章

相似问题

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