首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >我这计时器怎么了?

问我这计时器怎么了?
EN

Stack Overflow用户
提问于 2014-02-21 00:21:15
回答 1查看 100关注 0票数 0

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

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

输出显示正在传递的延迟是循环的增量时间。不过,所需时间正常工作。示例输出:不做IT: 2971 3000不做IT: 2971 3000不做IT: 3145 3000做IT

问题是,只有当我打印“执行iT”或“不执行”行时,它才能工作,所以我猜想,当我注释掉“不做IT”行时,计时器的恢复是不够好的,就像我这样做时,没有“做它”输出。

编辑

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

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

回答 1

Stack Overflow用户

发布于 2014-02-21 00:28:59

我想你是想对照辩论中的时间,而不是拖延时间。

代码语言:javascript
复制
if(counter < time)
{
    counter += delay;
    std::cerr <<"NOT DOING IT:  "<<counter<<std::endl<<delay<<std::endl;
    return;
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21922620

复制
相关文章

相似问题

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