Boost.Asio Chronoベースのタイマー

Boost.Asioにはこれまでdeadline_timerというBoost.DateTimeのposix timeベースのタイマーがありましたが、Boost 1.49.0からBoost.Chronoベースの以下のタイマーが導入されました:

  • basic_waitable_timer : クロックの切り替え用
  • system_timer : system_clockでのタイマー
  • steady_timer : steady_clockでのタイマー
  • high_resolution_timer : high_resolution_clockでのタイマー


また、basic_waitable_timerのテンプレート引数として渡すクロック型が満たすべき要件を定義するためのwait_traitsという型も追加されています。


この新タイマーの使い方としては以下のようになります:

#include <iostream>
#include <boost/asio.hpp>
#include <boost/asio/steady_timer.hpp>

namespace asio = boost::asio;
namespace chrono = boost::chrono;

void on_timer(const boost::system::error_code& ec)
{
    if (!ec) {
        std::cout << "on timer" << std::endl;
    }
}

int main()
{
    asio::io_service io_service;
    asio::steady_timer timer(io_service); // chronoベースのタイマー

    timer.expires_from_now(chrono::milliseconds(100)); // chronoのdurationを渡す
    timer.async_wait(on_timer);

    io_service.run();
}

これを実行すると、100ミリ秒後に「on timer」と出力されます。