簡単にするために、これは NamedPipe SERVER が NamedPipe CLIENT がパイプに書き込むのを待っている状況です (WriteFile() を使用)。
ブロックしている Windows API は ReadFile() です。
サーバーは、ブロッキングを有効にして同期パイプ (オーバーラップ I/O なし) を作成しました
クライアントが接続され、サーバーがデータを待機しています。
通常の流れでは、クライアントが何らかのデータを送信し、サーバーがそれを処理してから ReadFile() に戻り、次のデータのチャンクを待ちます。
その間、イベントが発生し (ユーザー入力など)、NamedPipe SERVER は他のコードを実行する必要がありますが、ReadFile() がブロックされている間は実行できません。
この時点で、NamedPipe Client は私のアプリケーションではないので、私はそれを制御できないことに言及する必要があります。サーバーのブロックを解除するために数バイトを送信することはできません。ただそこに座ってデータを送信しません。私はクライアントの実装を制御できないため、その側で何も変更することはできません。
1 つの解決策は、すべての ReadFile() 操作が実行される別のスレッドを作成することです。そうすれば、イベントが発生したときにコードを処理できます。これに関する問題は、イベントにも別のスレッドが必要であるため、このサーバーのインスタンスごとに 2 つのスレッドを追加することです。これはスケーラブルである必要があるため、望ましくありません。
呼び出してみた別のスレッドから
DisconnectNamedPipe()
と
CloseHandle()
どちらも戻りません (クライアントがパイプに書き込むまで)。
次の理由により、同じパイプに接続して数バイトを書き込むことができません。
「名前付きパイプのすべてのインスタンスは同じパイプ名を共有しますが、各インスタンスには独自のバッファーとハンドルがあり、クライアント/サーバー通信用の個別のコンジットを提供します。」
http://msdn.microsoft.com/en-us/library/aa365590.aspx
私はそれを偽造する方法が必要です.64,000ドルの質問は次のとおりです。
ReadFile() のブロックを解除するにはどうすればよいですか?