独自の時計を作成するかどうかは、作成する時間の使い方によって異なります。たとえば、半分の速度で実行したい場合は:
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();
「」はプログラムの実行速度と何が関係していますか? –
私はこの質問が何であるか理解していない – lurscher
それは謎のビットだと思います。 – Robinson