実行中のタイマーでexpires_from_now()
に電話すると、 タイマーがキャンセルされ、新しいタイマーが呼び出されます。 関連するハンドラが呼び出されます。 キャンセルタイマーと期限切れタイマーの間のハンドラ を区別することは容易です。 しかし、期限切れのタイマーと再トリガーされたタイマーの間で を区別する方法があれば、私は疑問に思います。 どちらの場合も、ハンドラはエラーコードoperation_aborted
で と呼ばれます。 または、私はいくつかの詳細が欠落しているかもしれません。再突入ブーストからのキャンセルをどのように区別しますか?
次のコードは、次のような出力を生成します。
20120415 21:32:28079507 Main: Timer1 set to 15 s.
20120415 21:32:28079798 Main: Timer1 set to 12 s.
20120415 21:32:28079916 Handler1: Timer 1 was cancelled or retriggered.
20120415 21:32:40079860 Handler1: expired.
これはタイマーを再トリガすると、同じハンドラを呼び出すことにより、同じことを実行しますので、ハンドラは、キャンセルハンドラの アクションを実装することができないことを示唆しています行動。これは意図した動作ではない可能性があります。
#include <boost/asio.hpp>
#include <boost/thread.hpp>
#include <boost/date_time/posix_time/posix_time.hpp>
#include <boost/date_time/posix_time/posix_time_io.hpp>
#include <iostream>
using namespace boost::posix_time;
using namespace std;
void handler1(const boost::system::error_code &ec)
{
if (ec == boost::asio::error::operation_aborted)
{
cout << microsec_clock::local_time() << " Handler1: Timer was cancelled or retriggered." << endl;
}
else
{
cout << microsec_clock::local_time() << " Handler1: Timer expired." << endl;
}
}
boost::asio::io_service io_service1;
void run1()
{
io_service1.run();
}
int main()
{
time_facet *facet = new time_facet("%Y%m%d %H:%M:%S%f");
cout.imbue(locale(cout.getloc(), facet));
boost::asio::deadline_timer timer1(io_service1, seconds(15));
timer1.async_wait(handler1);
cout << microsec_clock::local_time() << " Main: Timer1 set to 15 s." << endl;
// now actually run the timer
boost::thread thread1(run1);
timer1.expires_from_now(seconds(12));
cout << microsec_clock::local_time() << " Main: Timer1 set to 12 s." << endl;
// here the timer is running, but we need to reset the deadline
timer1.async_wait(handler1);
thread1.join(); // wait for thread1 to terminate
}
、あなたが達成したいかを教えてください。より大きな写真は何ですか? –
私はいくつかのイベントトリガーターンオン遅延を実装しようとしています。私はそれを再トリガーせずに基本的なターンオン遅延を実装することができます。しかし、あなたが可変または変化する時間遅延を受け入れるならば、それを再トリガーする必要があります。 –
そして、何もしないでください。あなたはoperation_abortedを取得し、与えられたハンドラを覚えて、再度設定しますか? –