deadline_timerは一つの非同期操作しか持てないと思っていたらいくつでも持てるようです。
シングルスレッドで動かした場合。
#include <iostream> #include <boost/asio.hpp> namespace asio = boost::asio; void on_timer(const boost::system::error_code& error) { std::cout << "on timer" << std::endl; } int main() { asio::io_service io_service; asio::deadline_timer timer(io_service); timer.expires_from_now(boost::posix_time::seconds(2)); timer.async_wait(on_timer); timer.expires_from_now(boost::posix_time::seconds(4)); timer.async_wait(on_timer); io_service.run(); }
on timer on timer
2スレッド使った場合。
#include <iostream> #include <boost/asio.hpp> #include <boost/thread.hpp> namespace asio = boost::asio; void on_timer(const boost::system::error_code& error) { std::cout << "on timer" << std::endl; } int main() { asio::io_service io_service; asio::deadline_timer timer(io_service); timer.expires_from_now(boost::posix_time::seconds(2)); timer.async_wait(on_timer); timer.expires_from_now(boost::posix_time::seconds(4)); timer.async_wait(on_timer); boost::thread t1(boost::bind(&asio::io_service::run, &io_service)); boost::thread t2(boost::bind(&asio::io_service::run, &io_service)); t1.join(); t2.join(); }
on timer on timer
ひとつのdeadline_timerで複数のタイマーが動いてます。
追記 2011/06/28 15:44:
これだと、1つめのタイマーがキャンセルされてしまうようです…。
検証不足によるミスでした。
#include <iostream> #include <boost/asio.hpp> #include <boost/format.hpp> namespace asio = boost::asio; void on_timer(const boost::system::error_code& error) { std::time_t t; std::time(&t); std::tm* st = std::localtime(&t); std::cout << boost::format("%1%/%2%/%3% %4%:%5%:%6% : ") % (1900 + st->tm_year) % (1 + st->tm_mon) % st->tm_mday % st->tm_hour % st->tm_min % st->tm_sec << error.message() << std::endl; } int main() { asio::io_service io_service; asio::deadline_timer timer(io_service); timer.expires_from_now(boost::posix_time::seconds(2)); timer.async_wait(on_timer); timer.expires_from_now(boost::posix_time::seconds(4)); timer.async_wait(on_timer); io_service.run(); }
2011/6/28 15:46:27 : Operation canceled 2011/6/28 15:46:31 : Undefined error: 0