0

クロノを使用してタイマーを実装しようとしていますが、何かが足りないように感じます。関数が反復ごとに呼び出されることが重要ですが、一部の命令は遅延後にのみ実行されます。これは、より大きなプロジェクトからの単純化された例です。私は何が欠けていますか?

#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」行を印刷したときにのみ機能することです私がそれをすると、「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;
}
4

1 に答える 1

0

遅延ではなく、引数で指定された時間に対してチェックしたかったと思います。

if(counter < time)
{
    counter += delay;
    std::cerr <<"NOT DOING IT:  "<<counter<<std::endl<<delay<<std::endl;
    return;
}
于 2014-02-21T00:28:59.340 に答える