2016-04-14 14 views
0

私は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で意図した振る舞いを、たくさん作成する必要なしに得る方法はありますか?

答えて

1

タイマーは、一度に1つの未処理のasync_waitしか持たない必要があります。 IIRCを呼び出すと、async_wait()の後にcancel()を呼び出した場合と同じように、別のコードを発行すると暗黙的に最初のコードがキャンセルされます(エラーコード付きのハンドラが呼び出されます)。

2つのタイマーイベントに応答する場合は、2つの選択肢があります。 2つのタイマーを持つか、タイムアウトを設定し、最初のハンドラで2番目のasync_waitを発行します。

+0

ええ、私が見たことは、あなたが追加するすべてのasync_waitは残りの部分と同時に "同時に"実行されるということです。私がやることは、shared_ptrsのベクトルをデッドラインタイマーに保つことです。 – vicg

+0

@vicgタイマーは動かすことができます。共有ポインターの必要はありません。 –

+0

タイマーは複数の非同期待機操作を保留できます。ただし、タイマーは1つの有効期限を持つことができます。有効期限を変更すると、タイマーの未処理の非同期待機操作がすべてキャンセルされます。 –

関連する問題