シリアル ポート通信に Windows で I/O 完了ポートを使用しています (シリアル ポートを大量に使用する可能性があります)。IOCP を作成し、I/O スレッドをスピンアップし、CreateFile()
ハンドルを IOCP に関連付けます (CreateFile()
で呼び出されましたFILE_FLAG_OVERLAPPED
)。それはすべてうまくいっています。完全に非同期にするために、に設定されているものを除いて、COMMTIMEOUTS
すべてを 0に設定しました。ReadIntervalTimeout
MAXDWORD
私の I/O スレッドで、それがGetQueuedCompletionStatus()
無期限にブロックされることに気付きました。INFINITE
タイムアウトを使用しています。そのためReadFile()
、ハンドルを IOCP に関連付けた直後に呼び出しを行いました。これによりGetQueuedCompletionStatus()
、なんらかの理由で 0 バイトが転送されてすぐに解放されますが、エラーはありません (true を返し、GetLastError() は 0 を報告します)。何もすることがない場合は、明らかにブロックしたいと思います。ReadFile()
GetQueuedCompletionStatus() の後に別のスレッドを配置すると、プール内の別のスレッドがそれを取得し、0 バイトが転送され、エラーは発生しません。
私が見てフォローした例では、IOCP を使用しているときに構造体に をhEvent
設定している人はいません。OVERLAPPED
それは必要ですか?私は IOCP スレッドをブロックしたくありませんCreateEvent(...) | 1
。
必要でない場合、何が問題を引き起こしている可能性がありますか? GetQueuedCompletionStatus()
データがシリアル ポートに到着するまでブロックする必要があります。
そこに良いIOCPシリアルポートの例はありますか? 完全なシリアル ポート + IOCP の例は見つかりませんでした。それらのほとんどはソケット用です。理論的には、シリアルポート、ファイル、ソケットなどで機能するはずです。