私はdeadline_timerクラスを試していたので、以下のコードを書いて、異なる時刻に実行される複数のasync_wait操作でdeadline_timerを使用できるかどうかを確認してください。boost :: asioでは、複数の実行時間で1つのdeadline_timerを使用できますか?
以下、メイン機能のデッドラインタイマーを一番下に作成し、最初は3秒後に期限切れになるように設定しました。次に、async_waitオペレーションを呼び出して、最初のprint関数をハンドラとして渡します。次に、expires_from_now操作を使用して、print2をハンドラとして持つ2番目のasync_wait呼び出しにのみ影響することを意図したものの有効期限を設定します。これを実行している出力はコードの下にあります。
これは、ここでtest1.cpp
#include <iostream>
#include <string>
#include <boost/asio.hpp>
#include <boost/date_time/posix_time/posix_time.hpp>
#include <boost/bind.hpp>
#include <time.h>
#include <sys/time.h>
double get_wall_time(){
struct timeval time;
if (gettimeofday(&time,NULL)){
// Handle error
return 0;
}
return (double)time.tv_sec + (double)time.tv_usec * .000001;
}
void print(double start, const boost::system::error_code& /*e*/)
{
std::cout << "Hello, world!" << std::endl;
std::cout << get_wall_time() - start << std::endl;
}
void print2(double start, const boost::system::error_code& /*e*/)
{
std::cout << "SECOND Hello, world!" << std::endl;
std::cout << get_wall_time() - start << std::endl;
}
int main(int argc, char* argv[])
{
boost::asio::io_service io;
boost::asio::deadline_timer timer(io, boost::posix_time::seconds(3));
auto start = get_wall_time();
timer.async_wait(boost::bind(print, start, boost::asio::placeholders::error));
timer.expires_from_now(boost::posix_time::seconds(20));
timer.async_wait(boost::bind(print2, start, boost::asio::placeholders::error));
io.run();
return 0;
}
では、出力
Hello, world!
0.000774145
SECOND Hello, world!
20.0085
これは、有効期限の変更で二async_waitをコメントアウトした後に出力されています。
Hello, world!
3.00079
最初のハンドラは、3秒後に実行しようとしたときに即座に実行されます。 2番目のハンドラは20秒後に正しく実行されます。私がdeadline_timerで意図した振る舞いを、たくさん作成する必要なしに得る方法はありますか?
ええ、私が見たことは、あなたが追加するすべてのasync_waitは残りの部分と同時に "同時に"実行されるということです。私がやることは、shared_ptrsのベクトルをデッドラインタイマーに保つことです。 – vicg
@vicgタイマーは動かすことができます。共有ポインターの必要はありません。 –
タイマーは複数の非同期待機操作を保留できます。ただし、タイマーは1つの有効期限を持つことができます。有効期限を変更すると、タイマーの未処理の非同期待機操作がすべてキャンセルされます。 –