1

以下の公式ブーストリンク: 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()関数)を呼び出させずに、古いタイマーを更新してキャンセルする方法はありますか?

4

1 に答える 1

3

実際の作業を行う前に、1行のチェック(中止/キャンセルイベントかどうかを確認)を追加することで修正できます。

void handler1(const boost::system::error_code &e)
{
    if (e != boost::asio::error::operation_aborted) // here is the important part
        {
            //do actual stuff here if it's not a cancel/abort event
        }
}
于 2012-04-18T15:19:30.893 に答える