4

オーバーラップとして作成されたパイプ ハンドルがあります。データを並行して読み書きする必要があります。どうすればこれを達成できますか?

オーバーラップされた I/O を使用する名前付きパイプ サーバーのドキュメント ページには、多くのパイプを読み書きする方法の例が示されていますが、「単一のパイプ インスタンスでの同時操作が回避されます」。

Windows上のC++でこれを行う正しい方法は何ですか? 適切な例を提出することも、トピックに関するヘルプを提出することもできません。

私が直面する主な問題は、読み取るデータがなく、最終的には WriteFile で書き込むことができない場合に、通常の ReadFile がブロックすることです。ブロックしない読み取り対象があるかどうかを教えてくれる方法は見つかりませんでした。私が理解している限りでは、OVERLAPPED 構造体を渡す必要がありますが、1 つのパイプ (多くない) への並列読み取りと書き込みの場合にそれを使用する方法がわかりません。

Synchronous and Overlapped Pipe I/Oで述べられているように、可能である必要があります。

オーバーラップ操作により、1 つのパイプでデータの読み取りと書き込みを同時に行うことができ、1 つのスレッドで複数のパイプ ハンドルに対して同時に I/O 操作を実行できます。

4

2 に答える 2

2

必要なのは、同時操作のそれぞれに異なる OVERLAPPED 構造を提供することだけです。あなたの場合、それは、2 つのスレッドのそれぞれに独自の OVERLAPPED 構造が必要であることを意味します。スレッドはおそらく異なる機能を実行しているため、グローバル変数を使用して混乱しない限り、これは自動的に行われるはずです。

複数のスレッドの必要性を回避するために重複した I/O を使用することに焦点を当てているそのサンプルから始めることで、物事を過度に複雑にしていることに注意してください。

代わりに、重複しない I/O を使用して 2 つの関数のそれぞれを記述しているふりをしますが、ReadFile または WriteFile を呼び出すときは常に、イベント ハンドルを含む有効な OVERLAPPED 構造を含め、WaitForSingleObject でフォローアップします。知っておくべきことがいくつかあります: スレッドがそれぞれ独自のイベント オブジェクトを作成することを確認する必要があり、I/O 操作がすぐに完了する場合 (つまり、ERROR_IO_PENDING ではなく ERROR_SUCCESS を返す) を処理する必要があります。それ以外の場合は、すべてかなり簡単です。

うまくいかない場合は、コードを表示してください。

于 2013-08-08T01:49:55.893 に答える