2013-06-24 23 views

答えて

7

既存の非同期ライブラリとのやりとりを理解することなく簡潔な解決策を提供することは困難です。それにもかかわらず、このanswerは、Boost.FutureとBoost.Asioを使用してActive Objectパターンを実装します。 creating a futureは、より適切であるアプローチを決定するために、既存の非同期ライブラリを調べて検討した場合:

  • boost::packaged_taskfutureを作成することができファンクタを提供します。このファンクタは、Boost.Asio io_serviceのコンテキスト内で実行できます。既存の非同期ライブラリーと統合するために、さらにはrvalueセマンティクスを回避するために、いくつかのレベルのラッピングが必要になる場合があります。現行の関数呼び出しがすでに値を戻している場合は、この方法を使用することを検討してください。
  • boost::promiseは、その値を設定できる下位レベルのオブジェクトを提供します。既存の関数を変更する必要がある場合は、引数としてpromiseを受け入れ、関数内にそれを設定する必要があります。 promiseは、Boost.Asio io_serviceに提供されるハンドラにバインドされます。 boost::packaged_taskと同様に、rvalueセマンティクスを処理するには追加レベルのラッピングが必要な場合があります。

最後に、Boost.Asio 1.54(現在ベータ版)はC++ futuresのファーストクラスサポートを提供しています。ここに公式exampleがあります。現在1.54ベータ版を使用することができない場合でも、インターフェイスと実装を調べることは有益です。

4

あなたは、この例を見てみてくださいすることができ:

http://www.boost.org/doc/libs/1_61_0/doc/html/boost_asio/example/cpp11/futures/daytime_client.cpp

それはブーストASIOでstd::futureを使用する方法を示しています。

#include <boost/asio/use_future.hpp> 

は、その後、あなたがそのようなコードを書くことができます:

std::future<std::size_t> my_future = 
    my_socket.async_read_some(my_buffer, boost::asio::use_future); 

あなたは、私は他の変形を実装することをお勧めしたいboost::futureを使用する必要がある場合

重要な点は、ファイルuse_future.hppを含めることです、boost::asio::use_futureに似ています。
ファイルuse_future.hppはそのための良い例です。

+0

これは決して動作しません。それはasioを永遠にブロックします – madduci

+1

よく、このようなソリューションは私のプロジェクトで活発に使用されています。そして、それは動作します。本当にあなたのケースでasioをブロックする理由を知っていますか? –

+0

明らかに、各将来のブロック例のコード。先物を使っているのは、それぞれをブロックしているだけです。最初の場所でブロックコードを使用するだけでもいいです... – kralyk

関連する問題