簡體   English   中英

這個計時器我怎么了?

[英]What am I doing wrong with this 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 DO IT”行時才起作用,所以我猜測當我將“ NOT DOIT 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;
}

我認為您想核對參數中給出的時間,而不是延遲。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM