2012-04-18 16 views
1

以下の公式のブーストリンク: http://www.boost.org/doc/libs/1_35_0/doc/html/boost_asio/reference/deadline_timer.htmlboost :: asio :: deadline_timerを更新すると、ハンドラ関数がまだ呼び出されていません

期限が切れる前に、非同期の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の有効期限時間

を変更します

保留中の非同期待機中にタイマーの有効期限を変更すると、それらの待機操作が取り消されます。タイマーに関連付けられたアクションが一度だけ実行されることを確実にするために、このようなものを使用:使用:私は疑問に思って

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()関数

私の愚かな質問、ちょうど実際のものを行う前に(それが中断/中止イベントだかどうかを確認)が1行のチェックを追加することによって固定することができdiscoveried
+0

AFAICTは、あなたが質問にあなた自身の質問に答え自体?コピー貼り付けされたドキュメントの例では、on_timeoutには既に適切なチェックがありましたか? – Rawler

+0

そうですね、私はそこからコードをコピー/ペーストしていませんでした。私は自分自身で書きました。なぜなら、私は第1位でそれを見つけられなかったのですが、すぐにそれを見つけて、しかし、十分に面白い誰かがこの笑をdownvoted – Gob00st

答えて

3

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 
     } 
} 
関連する問題