- Published on
C++ で一定間隔で処理を行う
- Authors
- Name
- Daisuke Kobayashi
- https://twitter.com
仕事で処理を一定間隔で行うプログラムを書きました.処理時間がある程度ランダムになった場合,処理間隔の整数倍になるように待ちを入れて再度処理を行います.処理時間の計算には Boost.Chrono の high_resolution_clock が高精度ということでそれを使ってます.
#include <iostream>
#include <boost/chrono.hpp>
#include <boost/random.hpp>
#include <boost/thread.hpp>
#include <boost/timer/timer.hpp>
void measure()
{
boost::random::mt19937 gen;
boost::random::uniform_int_distribution<> dist(1000, 1800);
boost::this_thread::sleep_for(boost::chrono::milliseconds(dist(gen)));
}
int main()
{
using namespace boost;
long long interval_ns = 2 * 1000 * 1000 * 1000;
chrono::high_resolution_clock::time_point start, end;
for (int i = 0; i < 10; i++) {
timer::cpu_timer t;
start = chrono::high_resolution_clock::now();
measure();
end = chrono::high_resolution_clock::now();
chrono::nanoseconds actual_interval_ns = end - start;
long long ns = actual_interval_ns.count();
int num_interval = ns /interval_ns;
this_thread::sleep_for(chrono::nanoseconds((num_interval + 1) * interval_ns - ns));
std::cout << t.elapsed().wall / 1000000.0 << std::endl;
}
return 0;
}