以下の公式ブーストリンク: http ://www.boost.org/doc/libs/1_35_0/doc/html/boost_asio/reference/deadline_timer.html 。
期限切れになる前に非同期deadline_timerを更新できることがわかります。それは問題ありません、コードは機能します:タイマーが更新されたとき、古いasync_waitはキャンセルされましたが、それは問題ありませんが、キャンセルされたとき、それはまだハンドラーを呼び出します:
void handler(const boost::system::error_code& error)
{
if (!error)
{
// Timer expired.
}
}
...
// Construct a timer with an absolute expiry time.
boost::asio::deadline_timer timer(io_service,
boost::posix_time::time_from_string("2005-12-07 23:59:59.000"));
// Start an asynchronous wait.
timer.async_wait(handler);
アクティブなdeadline_timerの有効期限を変更する
保留中の非同期待機中にタイマーの有効期限を変更すると、それらの待機操作がキャンセルされます。タイマーに関連付けられたアクションが1回だけ実行されるようにするには、次のようなものを使用します。
void on_some_event()
{
if (my_timer.expires_from_now(seconds(5)) > 0)
{
// We managed to cancel the timer. Start new asynchronous wait.
my_timer.async_wait(on_timeout);
}
else
{
// Too late, timer has already expired!
}
}
void on_timeout(const boost::system::error_code& e)
{
if (e != boost::asio::error::operation_aborted)
{
// Timer was not cancelled, take necessary action.
}
}
古いタイマーにハンドラー(この場合はon_timeout()関数)を呼び出させずに、古いタイマーを更新してキャンセルする方法はありますか?