1

シリアル ポート通信に Windows で I/O 完了ポートを使用しています (シリアル ポートを大量に使用する可能性があります)。IOCP を作成し、I/O スレッドをスピンアップし、CreateFile()ハンドルを IOCP に関連付けます (CreateFile()で呼び出されましたFILE_FLAG_OVERLAPPED)。それはすべてうまくいっています。完全に非同期にするために、に設定されているものを除いて、COMMTIMEOUTSすべてを 0に設定しました。ReadIntervalTimeoutMAXDWORD

私の I/O スレッドで、それがGetQueuedCompletionStatus()無期限にブロックされることに気付きました。INFINITEタイムアウトを使用しています。そのためReadFile()、ハンドルを IOCP に関連付けた直後に呼び出しを行いました。これによりGetQueuedCompletionStatus()、なんらかの理由で 0 バイトが転送されてすぐに解放されますが、エラーはありません (tr​​ue を返し、GetLastError() は 0 を報告します)。何もすることがない場合は、明らかにブロックしたいと思います。ReadFile()GetQueuedCompletionStatus() の後に別のスレッドを配置すると、プール内の別のスレッドがそれを取得し、0 バイトが転送され、エラーは発生しません。

私が見てフォローした例では、IOCP を使用しているときに構造体に をhEvent設定している人はいません。OVERLAPPEDそれは必要ですか?私は IOCP スレッドをブロックしたくありませんCreateEvent(...) | 1

必要でない場合、何が問題を引き起こしている可能性がありますか? GetQueuedCompletionStatus()データがシリアル ポートに到着するまでブロックする必要があります。

そこに良いIOCPシリアルポートの例はありますか? 完全なシリアル ポート + IOCP の例は見つかりませんでした。それらのほとんどはソケット用です。理論的には、シリアルポート、ファイル、ソケットなどで機能するはずです。

4

1 に答える 1

0

私はそれを理解しました-私は構造体で、そしてそれから呼び出しSetCommMask()ていませんでした。それを行った後、IOCPスレッドは期待どおりに動作しました。新しいキャラクターがポートに現れたときに返されます。その後、電話をかけることができます。EV_RXCHAR | EV_TXEMPTYWaitCommEvent()OVERLAPPEDGetQueuedCompletionStatus()ReadFile()

したがって、元の質問に答えるには、「いいえ、シリアルポートを使用してIOCPにhEventを設定する必要はありません」。

于 2011-06-03T05:48:58.370 に答える