2012-04-07 11 views
0

私は、(自国の)既存のタイムクラスからC++ 11の新しい時間機能を使用するように既存のプログラムを移行しようとしています。リアルタイム処理のために、C++ 11の機能性を自国の時間クラスにどのようにマッピングするかは明らかです。非リアルタイムモードをサポートするためにC++ 11のクロノタイム機能をどのように使用できるかは、あまり明確ではありません(たとえば、「できるだけ速く実行できます」、「1/4速度デモンストレーションモードで実行する」など)。 。)自家製のクラスがサポートしています。これは壁の時間を「再生」速度に正しくマップしている特別なclockを定義することによって達成されますか?どのような助けを歓迎し、例は素晴らしいだろう。例えば実時間モードと非実時間モードをサポートするプログラム

、Iが遷移するコードは、

MessageQueue::poll(Seconds(1)); 

又はSecondsまたはMinutesオブジェクトは、プログラムがで実行される速度を知っている

sleep(Minutes(2)); 

として構築物を有します乗算器や変換関数をすべての場所で使用する必要を避けるために、

MessageQueue::poll(PlaybackSpeed * Seconds(1)); 

または

MessageQueue::poll(PlaybackSpeed(Seconds(1))); 

私は期待していた何が可能であったカスタムclockを提供することにより、std::chrono::durationstd::chrono::time_pointと行動の同じ種類を得ることでした。この場合の

+3

」はプログラムの実行速度と何が関係していますか? –

+3

私はこの質問が何であるか理解していない – lurscher

+0

それは謎のビットだと思います。 – Robinson

答えて

2

独自の時計を作成するかどうかは、作成する時間の使い方によって異なります。たとえば、半分の速度で実行したい場合は:

std::this_thread::sleep_for(std::chrono::minutes(2)); 

時間は調整されません。代わりに、sleep_untilを使用し、あなたの「遅い」時計を使用する時点を提供する必要があります。しかし、ゆっくりと走るクロックを作ることは非常に簡単です:

template<typename Clock,int slowness> 
struct slow_clock { 
    using rep = typename Clock::rep; 
    using period = typename Clock::period; 
    using duration = typename Clock::duration; 
    using time_point = std::chrono::time_point<slow_clock>; 

    constexpr static bool is_steady = Clock::is_steady; 

    static time_point now() { 
     return time_point(start_time.time_since_epoch() + ((Clock::now() - start_time)/slowness)); 
    } 

    static const typename Clock::time_point start_time; 
}; 

template<typename Clock,int slowness> 
const typename Clock::time_point 
slow_clock<Clock,slowness>::start_time = Clock::now(); 

time_points()は、あなたがそれを与えるクロックに遅い速度の相対的で進歩しているように見えます今から返されました。あなたはナノ秒がゆっくりでダニ見ることができるので、例えば、ここでプログラムがあります:

int main() { 
    using Clock = slow_clock<std::chrono::high_resolution_clock,500000000>; 
    for(int i=0;i<10;++i) { 
     std::this_thread::sleep_until(Clock::now() 
             + std::chrono::nanoseconds(1)); 
     std::cout << "tick\n"; 
    } 
} 

あなたが実装する機能のすべてを、MessageQueue::poll()のように、おそらくグローバルクロックのtypedefの面で実装する必要があります。

もちろん、プログラムを実際に実行する速さとは関係ありません。プログラムに基づいてプログラムの速度を遅くしている場合を除きます。時間切れになる関数は時間がかかりますが、sleep_untilは時間がかかりますが、将来のある時点を待たない操作は単純に高速に見えます。

// appears to run a million times faster than normal according to (finish-start) 
auto start = slow_clock<steady_clock,1000000>::now(); 
do_slow_operation(); 
auto finish = slow_clock<steady_clock,1000000>::now(); 
+0

これはまさに私が望んでいたものではありませんでしたが、思慮深い答えに感謝します。 – bpw1621

0

:あなたは自分のメッセージキューは、で動作するようになっているもの、「スピード」理解させる場合は、簡単に標準時間のクラスを使用することができ

MessageQueue::poll(Seconds(1)); 

。半速で動作させたい場合は、MessageQueue::setPlaybackSpeed(0.5)のようなものを呼び出し、誰かがそれを与えたときからその要因をキューに使用させてください。このためとして

sleep(Minutes(2)); 

あなたの古いコードは何をしていましたか? Minutes()が作成したオブジェクトに暗黙の変換演算子があって何秒も返されたintになったと思いますか?これはあまりにも魔法のように思えます。あなたのMessageQueueや他のクラスでsleep()メソッドを作成し、上記のものと同じソリューションを使用することができます。

関連する問題