2017-06-18 7 views
1

私はシリアルデバイスから読み込み、バイトが利用可能になったときにバイトを処理するためにasioを使いたいと思う。データがシリアルデバイス上で利用可能になるまで、asioを効率的にブロックする方法はありますか?

async_read_untilを使用している場合は、ファイルの終わり(EOF)エラーのために自分のコールバックがほとんどの時間呼び出されます。したがって、データが利用可能になるまで、コールバックを終了して再度登録する必要があります。これは、私が避けたいと思うビジーなループを引き起こします。同じEOFエラーですぐに戻るread_untilにも同様のことが起こります。

POSIXの場合、デバイス上でデータが利用可能になるまで効率的に待つためにpollがありますが、私は携帯用の(Windowsを含む)asio関数を使用して同様の効果を達成します。 asioにはasio::descriptor_base::bytes_readableがあり、データが利用可能であれば事前にテストすることができますが、データが利用可能になるまでブロックするにはアクティブなループでこれをテストする必要があります。

asioでデータが利用可能なときにだけ非同期コールバックを呼び出す方法はありますか?例えば。 async_read_untilのエラーをマスクして、これらのエラーでコールバックが呼び出されないようにすることはできますか?

+1

たぶん、あなたはhttp://www.boost.org/doc/libs/1_64_0/doc/html/boost_asio/overview/core探している:

典型的な読み取りハンドラは次のようになります。 /reactor.html – sehe

答えて

0

利用可能なデータを読み取る場合は、async_read_untilの代わりにasync_read_some関数を使用することをお勧めします。Streams, Short Reads and Short Writesを参照してください。

void read_handler(const boost::system::error_code& error, size_t bytes_transferred) 
{ 
    if (error != boost::asio::error::operation_aborted) 
    { 
    if (error) 
     // handle error 
    else 
    { 
     // process bytes_transferred data from the buffer 
     // enable reception by calling async_read_some on the socket with a buffer 
    } 
    } 
} 
関連する問題