这个计时器我做错了什么?

时间:2014-02-21 00:21:15

标签: c++ c++11 timer chrono

使用计时器我一直试图实现一个计时器,但我觉得我错过了一些东西。在每次迭代时调用函数很重要,但是一些指令只会在延迟之后执行。这是一个较大项目的简化示例。我错过了什么?

#include <iostream>
#include <chrono>
using namespace std;
using namespace std::chrono;
const double delay = duration_cast<milliseconds>(seconds(5)).count();
double counter = 0.f;
void doit(const double time)
{
    if(counter < delay)
    {
        counter += time;
        std::cerr <<"NOT DOING IT:  "<<counter<<std::endl<<delay<<std::endl;
        return;
    }
    counter = 0.f;
    std::cerr <<"DOING IT"<<std::endl;
}

int main()
{
    duration<double,std::milli> timetaken;
    duration<double,std::milli> looptime;
    auto start = high_resolution_clock::now();
    auto end = high_resolution_clock::now();
    timetaken = end - start;
    auto loopstart = end;

    while(timetaken < std::chrono::seconds(10))
    {
        looptime = duration_cast<milliseconds>(loopstart - end);
        loopstart = end;

        doit(looptime.count());


        end = high_resolution_clock::now();
        timetaken = end - start;


    }
    std::cerr<<"TT:"<<duration_cast<seconds>(timetaken).count()<<std::endl;
    return 0;
}

输出显示传递的延迟是循环的增量时间。虽然时间戳正常。样本输出:     不做它:2971     3000     不做它:2971     3000     不做:3145     3000     做它

麻烦的是它只有在我打印“DOING iT”或“NOT DOING IT”行时才有效,所以当我评论出“不做它”时,我猜测定时器的解决方案不够好“当我这样做时,没有”做它“输出。

修改

好的,通常情况下,编写简化版本会指出我正确的方向。正如我所提到的,这似乎是一个解决问题。通过将单位更改为纳秒,它似乎正如我所期望的那样工作。我仍然希望听到任何怀疑一般方法或有更明智的想法/参考的人。这是我的工作版本:

#include <iostream>
#include <chrono>
using namespace std;
using namespace std::chrono;
const double delay = duration_cast<nanoseconds>(seconds(2)).count();
double counter = 0.f;
void doit(const double time)
{
    if(counter < delay)
    {
        counter += time;
        //std::cerr <<"NOT DOING IT:  "<<counter<<std::endl<<delay<<std::endl;
        return;
    }
    counter = 0.f;
    std::cerr <<"DOING IT"<<std::endl;
}

int main()
{
    duration<double,std::nano> timetaken;
    duration<double,std::nano> looptime;
    auto start = high_resolution_clock::now();
    auto end = high_resolution_clock::now();
    timetaken = end - start;
    auto loopstart = end;

    while(timetaken < std::chrono::seconds(10))
    {
        looptime = duration_cast<nanoseconds>(end - loopstart);
        loopstart = end;

        doit(looptime.count());


        end = high_resolution_clock::now();
        timetaken = end - start;


    }
    std::cerr<<"TT:"<<duration_cast<seconds>(timetaken).count()<<std::endl;
    return 0;
}

1 个答案:

答案 0 :(得分:0)

我认为你想要检查论证中给出的时间,而不是延迟。

if(counter < time)
{
    counter += delay;
    std::cerr <<"NOT DOING IT:  "<<counter<<std::endl<<delay<<std::endl;
    return;
}
相关问题