2016-09-06 32 views
0

私は、TClientSocketを使って、C#で書かれた別のアプリケーションにデータを送信しているアプリケーションをDelphiで書いています。多くの理由から、C#アプリケーションは応答が遅く、Delphiアプリケーションをブロックし、設定したタイムアウトを尊重しません。Delphi永続的接続のTClientSocket

私のDelphiアプリケーションは、このような応答を読み取ります

Sock.Socket.ReceiveText 

これは、応答を待つアプリケーションの原因となります。私が代わりにこれを行う場合でも、アプリケーションの待機とタイムアウトを尊重:

while not receiveData do 
begin 
    if Sock.Socket.ReceiveLength > 0 then 
    begin 
    receiveData := True; 
    end; 
    Inc(Cont); 
    Sleep(100); 

    if (Cont > 10) then 
    raise Exception.Create('Timeout'); 
end; 

私のDelphiのアプリは2つの要求を送信します。最初の1回はタイムアウトしますが、C#はまだそれを処理しています。私のDelphiアプリケーションは2番目のリクエストを送信し、今回はC#が最初のリクエストのレスポンスを送信します。

2番目の要求は最初の要求のデータを受信しますか?あるいは、私がDelphiでタイムアウトしたとき、彼らは情報を渡すでしょうか?

答えて

3

Delphiコードがタイムアウトすると、最初のリクエストについては忘れてしまいますが、C#コードではそれが分かりません。接続を切断していないので、2番目の要求は実際に最初の要求の応答データを受信します。タイムアウトロジックを実装してタイムアウトの原因を無視することで、2つのアプリケーションが互いに同期しなくなります。そのため、より長いタイムアウトを使用するか、タイムアウトが発生した場合は接続を切断してください。

Delphiアプリケーションのフリーズは、ブロックモードでTClientSocketコンポーネントを使用し、メインUIスレッドのコンテキストで読み込みを実行している場合にのみ発生します。メインUIスレッドでブロッキングモードを使用するべきではありません。次のいずれかの非ブロックモードで

  1. 使用TClientSocket、唯一OnReadイベントにあなたの読書のすべてを行う、とReceiveLengthが示す以上のものを読んでいません。

  2. ブロッキングモードでTClientSocketを使用し、ワーカースレッドですべての読み取りを行い、処理できるデータがある場合にのみメインUIスレッドに信号を送ります(作業者のデータを処理する方が良いでしょう) UI更新を行うときはメインスレッドと同期するだけです)。

関連する問題