読者です 読者をやめる 読者になる 読者になる

Boost.Asio io_service::poll()

C++

Boost.Asioのio_serviceでは、イベントループの実行に基本的にはrun()を使用しますが、
似て非なる関数として、poll()というのも用意されています。


run()は、イベントキューが空になるまで待機しますが、
poll()は、準備ができているイベントを実行します。


ここでいう準備とは、ハンドラを即実行できる用意ができている、ということです。
なので、タイマーやIOの完了通知は、poll()では待ちません。

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

namespace asio = boost::asio;

void f()
{
    std::cout << "f" << std::endl;
}

void g(const boost::system::error_code& error)
{
    if (error) {
        std::cout << "error g" << std::endl;
    }
    else {
        std::cout << "correct g" << std::endl;
    }
}

int main()
{
    asio::io_service io_service;
    asio::deadline_timer timer(io_service);

    // 即実行できる関数
    io_service.post(f);

    // タイマー
    timer.expires_from_now(boost::posix_time::seconds(10));
    timer.async_wait(g);

    io_service.poll();
}
f

poll()で待機しなかったハンドラについては、poll()が終わったあとにrun()/run_one()などで処理してあげるといいでしょう。

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

namespace asio = boost::asio;

void f()
{
    std::cout << "f" << std::endl;
}

void g(const boost::system::error_code& error)
{
    if (error) {
        std::cout << "error g" << std::endl;
    }
    else {
        std::cout << "correct g" << std::endl;
    }
}

int main()
{
    asio::io_service io_service;
    asio::deadline_timer timer(io_service);

    io_service.post(f);

    timer.expires_from_now(boost::posix_time::seconds(10));
    timer.async_wait(g);

    io_service.poll();

    io_service.run_one();
}
f
correct g