C#とDelphiの間のプロシージャ間通信に名前付きパイプを使用しています。C#はSystem.IO.Pipes
パッケージを使用しますが、Delphiはを使用しLibby's pipes.pas
ます。残念ながら、通信はほとんど高性能です。プロファイリングにより、通信はランタイム全体の72%を占め、残りは計算に使用されることがわかりました。
リソースを消費する可能性のある問題を1つ見つけることができました。Delphiで送信側クライアントの接続を明示的に切断しないと、C#はデータをまったく受信しません。
Delphi(送信)
FClient1.Write(msg[1], Length(msg));
FClient1.FlushPipeBuffers;
FClient1.WaitForReply(20);
FClient1.Disconnect; // disconnect to signalize C# that the writing is finished
FClient1.Connect; // connect again to prevent synchronization problems
C#(受信)
// Wait for a client to connect
stc.pipeServer.WaitForConnection();
while (reconnect_attempts < MAX_RECONNECT_ATTEMPTS) //
{
string tmp = sr.ReadLine();
// if result is empty, try again for <MAX_RECONNECT_ATTEMPTS> times
// so you can eliminate the chance that there's just a single empty request
while (tmp != null)// && result != tmp)
{
tmp = sr.ReadLine();
result += tmp;
}
// sleep, increment reconnect, write debugging...
}
stc.pipeServer.Close();
再接続には費用がかかると思いますが、完全にはわかりません。1つのデータフロー(約1/11 kb)には、合計130(11kbの場合はそれぞれ270ms)がかかります(送信と受信)。
私の質問は次のようになります:
クライアントが書き込みを完了したことを通知するためにパイプを強制的に切断する必要がありますか?私の観察によると、これはlibby'sで送信する場合にのみ必要です。パフォーマンスが低下する他の考えられる原因はありますか?前もって感謝します。
さらに、送信と受信はその逆に行われます。
C#(送信)
stc.pipeClient.Connect();
StreamWriter sw = new StreamWriter(stc.pipeClient);
//sw.AutoFlush = true;
sw.WriteLine(msg);
sw.Flush();
stc.pipeClient.WaitForPipeDrain(); // waits for the other end to read all bytes
// neither disconnect nor dispose
Delphi(受信)
SetLength(S, Stream.Size); Stream.Read(S[1], Length(S));
FPipeBuffer := FPipeBuffer + S; { TODO 2 : switch case ID }
// if the XML is complete, i.e. ends with the closing checksum
if (IsFullMessage()) then
begin
// end reading, set flag
FIsPipeReady := true;
end