2010-12-15 25 views
7

私のアプリケーションに役立つ必要があります。コマンドラインパラメータに応答する簡単なプログラムです。アプリケーションが初めて呼び出されると、メインスレッドが別の処理を実行する間に、アプリケーションは別のスレッドでパイプサーバー(ブロッキング、オーバーラップしない)として起動します。これで、ユーザーは同じアプリケーション実行可能ファイルとコマンドラインパラメータを使用してアプリケーションを呼び出すことができますが、アプリケーションの最初のインスタンスではないため、パイプを使用してコマンドラインパラメータを最初のインスタンスに渡し、だから、それはパターンの単一のプロセスのようなものです。Windows Named Pipeの問題:エラーコード233が交互に表示される

理想的には、それは次のようにする必要があります:

app.exe "first" // starts app.exe as a pipe server and prints "first" 
app.exe "second" // client process causes server instance to print "second" 
app.exe "third" // client process causes server instance to print "third" 
app.exe "fourth" // client process causes server instance to print "fourth" 
app.exe "fifth" // client process causes server instance to print "fifth" 
app.exe -quit  // client process causes server instance to terminate. 

は今、私の唯一の問題は、私は上記の行を行う際にこの問題が発生し、次のとおりです。

app.exe "first" // starts app.exe as a pipe server and prints "first" 
app.exe "second" // client process returns a GetLastError code of 233 
app.exe "third" // client process causes server instance to print "third" 
app.exe "fourth" // client process returns a GetLastError code of 233 
app.exe "fifth" // client process causes server instance to print "fifth" 
app.exe -quit  // client process returns a GetLastError code of 233 

マイパイプサーバー・コードは、このような何かを行きます(擬似コード):

私のクライアントのバージョンは、このように書き
CreateNamedPipe(); 
// Code below now runs on a separate thread... 
while(!Quit) 
{ 
    if(ConnectNamedPipe() is successful) 
    { 
     if(PeekNamedPipe() has a message) 
     { 
      ReadFile(); 
      ProcessReceivedMessage(); 
     } 
     FileFlushBuffers(); 
     DisconnectNamedPipe(); 
    } 
} 
CloseHandle(the pipe); 

(擬似コード):

if(WaitNamedPipe(FOREVER) != 0) 
{ 
    GetParametersAndFormAMessage(); 
    CreateFile(); 
    WriteFile(); // Sends message to the pipe server 
} 
CloseHandle(); 

MSDNによれば、サーバーがDisconnectNamedPipe()を使用すると、クライアントは強制的に切断され、クライアントの次の試行時にエラーが発生します。それが理由だと思いますか?もしそうなら、余分なエラーが発生していないクライアントを切断するにはどうすればいいですか?そうでなければ、私はこの仕事をするために知っておくべきことは何ですか?これを考え出すのに多くの時間を費やしました。

答えて

10

パイプの別のサーバー側インスタンス上の各クライアントインスタンスとの通信は、別々のスレッドを使用して処理する必要があります。したがって、ConnectNamedPipe()が返ってくると、接続したばかりのクライアントからのメッセージを処理する前に、ただちに次のクライアントを待機する新しいリスナースレッドを生成します。

それぞれのクライアントは、新しく作成されたパイプのインスタンスを使用して通話し、ERROR_PIPE_NOT_CONNECTEDエラーは表示されません。

すなわち擬似コードのようなもの:

Main Thread 
{ 
    CreateListenerThread(); 
    WaitForQuitEvent(); 
} 

ListenerThread 
{ 
    ConnectNamedPipe(); 
    if (no error) 
    { 
     CreateListenerThread(); 
     if(PeekNamedPipe() has a message) 
     { 
      ReadFile(); 
      ProcessReceivedMessage(); // if -quit signal quit event 
     } 
     FileFlushBuffers(); 
     DisconnectNamedPipe(); 
     CloseHandle(); 
    } 
    else 
    { 
     // handle/report error 
    } 
} 
+0

これは論理的にあなたが(接続され得るんすべてのスレッドが新しいスレッドを生成するため)に接続されない一つのスレッドを持っていることを意味するだけクライアントが接続するのを待っています。実行が終了すると、そのスレッドが適切にクリーンアップされるようにするにはどうすればよいですか? –

関連する問題