2011-11-15 14 views
4

Delphi 7 Indy9ポーリングクライアントのトラブルシューティングを行っています。私はwaitforsingleobjectのTEventを追加しようとしました。エラーはreadlnで発生します。エラーは通常 'EIDConnection ... not connected'です。私はそれに時計を入れて、スレッドが終了します。接続がサーバーからmsgを受け取るまで、 'while'は条件を再評価しないので、msgを受け取るまではreadlnにグラインドします。時にはそれは正常に切断されますが、ほとんどの場合クラッシュします。これを行うにまたは私はちょうど私があなたが切断イベントを処理するためのいくつかのコードを追加する必要があると思うクライアントスレッドを正常に閉じる

procedure TReadingThread.Execute; 
begin 
    while not Terminated and FConn.Connected do 
    begin 
     // read msg from server 
     Msg := FConn.ReadLn; 
     Synchronize(ReceiveLine); 
    end; 
end; 
+2

実際の問題は何ですか?接続がクローズされている場合、 'ReadLn()'は例外的に例外を送出すると想定されます*。 'Connected()'への呼び出しを削除し、 'ReadLn()'にその処理をさせます。例外がスレッドを終了させる場合(これは正しいことでしょう)、例外がループから飛び出してから、 'while'は実行されない*ではありません。だから私はあなたが正確に何が問題になっているのか理解していない。 –

答えて

0

事前に...おかげでreadlnの周りを除いて...試みる入れて、続けていくん方法はあります。私は(この例では、tcpserverのはTIdTCPServerのインスタンスである)あなたが記述するものと同様の問題があったが、ここで私がやったことだ:

procedure TformRemoteControlWnd.tcpServerDisconnect(AContext: TIdContext); 
    (* 
    Connection is disconnected. Be careful, because this also gets called when 
    the app is shutting down while a connection is active, in which case 
    tcpServer may be gone already. 
    *) 
    begin 
     if not Application.Terminated and Assigned(tcpServer) then 
     begin 
     sbarStatus.SimpleText := 'TCP/IP Disconnected'; 
     tcpServer.Tag := 0; // used to prevent rentrancy 
     end; 

     // shut down connection to stop thread from calling OnExecute event 
     try 
     AContext.Connection.Disconnect; 
     except 
     Sleep(0); 
     end; 
    end; 
+0

'OnDisconnect'イベントが接続のために起動されると、' OnExecute'イベントはその接続に対して再び起動されません。 'OnDisconnect'ハンドラが終了すると、接続は終了します。 'OnDisconnect'イベントハンドラで' Disconnect() 'を呼び出す必要はありません。 –

+0

レミー - ありがとう、私はそれを試してみてください。それはもう少し前ですが、Disconnect()コールをそこに置かなければならない理由があったことを覚えているようです。 – ByteArts

0

私は答えを見つけたことが受信するまで... Readlnは無期限に待機しますキャリッジリターン。サーバーがメッセージを送信するか、ソケットが切断される(クラッシュの原因となる)まで、スレッドはReadlnに座ります。 Delphiコンパイラコードでは、OnDisconnectには、try...exceptを使用してエラーをトラップするコメントが書き込まれています。だから、私はちょうどソケットを切断する前にきれいに注意する必要があります。私はもっ​​ときれいなクローズ方法を見つけることができたと思った。すべての助けに感謝します。

関連する問題