read_async_some()
シリアルポートから非同期に読み込みを呼び出す連鎖しています。ある時点で、私は非同期読み取りをキャンセルし、関連するハンドラでこの事実を検出する必要があります。 the documentation for cancel()
から、私は単に私のハンドラに渡されたerror_code
をチェックして、そうすることを期待:私はread_async_someを保留にしてboost :: asio :: serial_portを閉じる
この機能は、すべての未処理の非同期がすぐに終了する 読み取り操作または書き込み原因となり、キャンセル 操作のためのハンドラが渡されます
boost::asio::error::operation_aborted
エラーです。私はこれをしようとすると
しかし、私のハンドラはinvalid_argument
エラーの代わりに期待operation_aborted
エラーと呼ばれています。ここでは、シリアルポートをエミュレートするpttyを使用して、問題を再現する最小限の例です:
void handle(boost::system::error_code const& error, size_t count)
{
std::cout << "error_code = " << error.message() << std::endl;
}
int main(int argc, char **argv)
{
std::fstream fs("/dev/ttyp0", std::ios::in | std::ios::ate);
boost::asio::io_service io;
boost::asio::serial_port serial(io, "/dev/ttyp0");
std::vector<uint8_t> buffer(1);
serial.async_read_some(boost::asio::buffer(buffer),
boost::bind(&handle,
boost::asio::placeholders::error,
boost::asio::placeholders::bytes_transferred
)
);
boost::thread thread(boost::bind(&boost::asio::io_service::run, &io));
serial.cancel();
thread.join();
fs.close();
}
少なくとも私にとっては、このプログラムの出力はerror_code = Invalid argument
です。なぜ私はドキュメントに記載されている動作を取得していないと誰も説明できますか?