4

私はまだライブラリにかなり慣れていないため、std::chrono で見つけることができるドキュメントは機能しません。

タイム スタンプを含むオブジェクトのコンテナーを実装しようとしています。オブジェクトはすべて、最新のものから古いものの順に保存され、std::chrono::time_point を使用して各タイム スタンプを表すことにしました。データを処理するスレッドは定期的にウェイクアップし、データを処理し、いつ再ウェイクアップする必要があるかを確認してから、その期間スリープします。

static std::chrono::time_point<std::chrono::steady_clock, std::chrono::milliseconds> _nextWakeupTime;

上記の宣言は、ミリ秒精度のステッド クロックを使用しているという印象を受けます。

次のステップは、_nextWakeupTime を現在の表現に設定することです。

_nextWakeupTime = time_point_cast<milliseconds>(steady_clock::now());

その行はコンパイルされません:

error C2679: binary '=' : no operator found which takes a right-hand operand of type 'std::chrono::time_point<_Clock,_Duration>' (or there is no acceptable conversion)
        with
        [
            _Clock=std::chrono::system_clock,
            _Duration=std::chrono::milliseconds
        ]
        chrono(298): could be 'std::chrono::time_point<_Clock,_Duration> &std::chrono::time_point<_Clock,_Duration>::operator =(const std::chrono::time_point<_Clock,_Duration> &)'
        with
        [
            _Clock=std::chrono::steady_clock,
            _Duration=std::chrono::milliseconds
        ]
        while trying to match the argument list '(std::chrono::time_point<_Clock,_Duration>, std::chrono::time_point<_Clock,_Duration>)'
        with
        [
            _Clock=std::chrono::steady_clock,
            _Duration=std::chrono::milliseconds
        ]
        and
        [
            _Clock=std::chrono::system_clock,
            _Duration=std::chrono::milliseconds
        ]

Windows システムでは、stead_clock は system_clock と同じものであることは理解していますが、ここで何が起こっているのかわかりません。私はこれを行うことができることを知っています:

_nextWakeupTime += _nextWakeupTime.time_since_epoch();

それが私が何をすべきかをうまく表しているとは思えません。


同じように、指定されたクロック/期間の time_point オブジェクトをインスタンス化し、現在と等しく設定する最良の方法は何ですか?

4

1 に答える 1

8

あなたにとって最も簡単なことは、_nextWakeupTimetypeを与えることsteady_clock::time_pointです。

steady_clock::time_point _nextWakeupTime;

これの解決方法を で照会できます。これtime_pointにより、静的メンバーとsteady_clock::time_point::periodが得られます。std::rationumden

typedef steady_clock::time_point::period resolution;
cout << "The resolution of steady_clock::time_point is " << resolution::num
     << '/' <<resolution::den << " of a second.\n";

エラーメッセージから、ベンダーが作成system_clock::time_pointsteady_clock::time_pointたものと同じように見えるtime_pointため、同じエポックを共有し、算術で2つを混在させることができます. この状況に移植可能に対処するには、次のように atime_pointのクロックをクエリできます。

time_point::clock

つまり、あなたの実装steady_clock::time_point::clockではそうではありませsteady_clocksystem_clocktime_pointと互換性があるがミリ秒の解像度が本当に必要な場合は、次のようsteady_clock::time_pointにすることができます。

time_point<steady_clock::time_point::clock, milliseconds> _nextWakeupTime;
于 2012-12-04T15:37:52.257 に答える