私はシリアルデバイスから読み込み、バイトが利用可能になったときにバイトを処理するためにasioを使いたいと思う。データがシリアルデバイス上で利用可能になるまで、asioを効率的にブロックする方法はありますか?
async_read_until
を使用している場合は、ファイルの終わり(EOF)エラーのために自分のコールバックがほとんどの時間呼び出されます。したがって、データが利用可能になるまで、コールバックを終了して再度登録する必要があります。これは、私が避けたいと思うビジーなループを引き起こします。同じEOFエラーですぐに戻るread_until
にも同様のことが起こります。
POSIXの場合、デバイス上でデータが利用可能になるまで効率的に待つためにpoll
がありますが、私は携帯用の(Windowsを含む)asio関数を使用して同様の効果を達成します。 asioにはasio::descriptor_base::bytes_readable
があり、データが利用可能であれば事前にテストすることができますが、データが利用可能になるまでブロックするにはアクティブなループでこれをテストする必要があります。
asioでデータが利用可能なときにだけ非同期コールバックを呼び出す方法はありますか?例えば。 async_read_until
のエラーをマスクして、これらのエラーでコールバックが呼び出されないようにすることはできますか?
たぶん、あなたはhttp://www.boost.org/doc/libs/1_64_0/doc/html/boost_asio/overview/core探している:
典型的な読み取りハンドラは次のようになります。 /reactor.html – sehe