Published on

C++ で一定間隔で処理を行う

Authors

仕事で処理を一定間隔で行うプログラムを書きました.処理時間がある程度ランダムになった場合,処理間隔の整数倍になるように待ちを入れて再度処理を行います.処理時間の計算には 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;
}