0

boost::asio::windows::stream_handle を使用し、async_read_some メソッドを使用して、名前付きパイプからデータを再帰的に読み取ります。async_read_some メソッドに read_handler を関連付けます。ただし、 async_read_some ハンドラーは一度だけ呼び出され、新しいメッセージがパイプを通過してもそれ以上呼び出されません。試行錯誤の方法で、 read_handler を async_read_some メソッドに再度割り当て、適切に呼び出されるようになりました。しかし、正しい方法であるか、パイプから継続的な応答を得るためのエレガントな方法を提案してください。

boost::asio::io_service my_io_service; 
boost::asio::windows::stream_handle pipe( my_io_service);
boost::array<char, 4096> buffer;

void CPublishSubscribeLib::read_handler(const boost::system::error_code& ec, std::size_t bytes_transferred)
{
if(bytes_transferred > 0 )
pipe.async_read_some(boost::asio::buffer(buffer, 150), boost::bind(&CPublishSubscribeLib::read_handler, this, _1, _2));
}

よろしくお願いします!

4

2 に答える 2

1

Boost.Asio を使用すると、1 つの非同期操作で関連付けられたハンドラーを 1 回だけ呼び出し、Boost.Asio が作成したハンドラーのすべてのコピーをすぐに削除できます。したがって、async_read_some操作が 1 回だけ開始された場合、ReadHandlerは 1 回だけ呼び出されます。同じ操作のハンドラー内から操作を開始して非同期チェーンを形成するのは、非常に一般的なパターンです。この場合、async_read_some内から操作を開始するのが通常CPublishSubscribeLib::read_handlerです。

于 2013-04-14T16:24:56.983 に答える