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