CancelIo()は、呼び出しスレッドに関連付けられたすべての保留中のI/O 操作をキャンセルすることになっています。私の経験では、CancelIo() は将来のI/O 操作もキャンセルすることがあります。与えられた:
ReadFile(port, buffer, length, &bytesTransferred, overlapped);
CancelIo(port)
読み取りの直前に呼び出すGetQueuedCompletionStatus()
と、読み取り操作を受け取ることはなく、永久にブロックされます。CancelIo(port)
読み取りの直後に呼び出すと、GetQueuedCompletionStatus()
0 が返されますGetLastError()==ERROR_OPERATION_ABORTED
- 私が呼び出し
CancelIo(port)
、保留中または後続の読み取りがない場合、GetQueuedCompletionStatus()
永遠にブロックされます。
ここで重要な点は、 のCancelIo()
実行がいつ終了したかを検出する方法がないことです。CancelIo()
実行が完了し、さらに読み取り要求を発行しても安全であることを確認するにはどうすればよいですか?
PS: http://osdir.com/ml/lib.boost.asio.user/2008-02/msg00074.htmlおよびhttp://www.boost.org/doc/libs/1_44_0/doc/html/を参照してください。 boost_asio/using.html CancelIo() は実際には使用できないようです。お客様は Windows XP のサポートを必要とする必要があります。私のオプションは何ですか?
注:シリアルポートから読んでいます。