3

TIdTCPServer異なるポート用に3つのバインディングを持つIndyサーバーがあります。クライアントをこれらの3つのポートに接続してからサーバーを非アクティブ化すると、デッドロックのように見える状態でスタックします。私が何をしても、クリックに反応せず、Windowsに「反応しない」とさえ報告しません。サーバーを非アクティブ化する前にクライアントを切断すると、すべてが完璧になります。のように「非アクティブ化」を意味しServer.Active:= False;ます。

他の誰かがこれを経験しましたか?何が原因でしょうか?ここでは、デッドロック(GUIの更新など)を引き起こす可能性のあるスレッドをまたぐようなことは何も起こっていません。不凍液コンポーネントを試しましたTIdAntiFreezeが、うまくいきませんでした。

4

2 に答える 2

4

TIdTCPServerマルチスレッドコンポーネントです。サーバーの非アクティブ化中のデッドロックは、1つ以上のクライアントスレッドが正しく終了していないことを意味します。これは通常、サーバーイベントハンドラーが実行してはならないことを実行していることを意味します。通常は、Indyの内部例外をキャッチして破棄するか、サーバーの終了でビジー状態のスレッドコンテキストと同期するか、Indy以外の何かでデッドロックします。実際のコードを見なければ、どちらが実際に当てはまるかを確実に知る方法はありませんが、この種のデッドロックを引き起こすのは常にユーザーエラーです。

TIdAntiFreezeメインスレッドのコンテキストで実行されるIndyコンポーネントにのみ影響します。TIdTCPServerはそうではありません。

于 2012-06-26T19:31:25.993 に答える
1

このコードをForm.OnCloseに追加しました。

プロシージャTformSFTP.FormClose(送信者:TObject; varアクション:TCloseAction);
var
  iA:整数;
  コンテキスト:TidContext;
始める
 sftpServidorFTP.Activeの場合
     sftpServidorFTP.Contexts.LockListを使用して
        試す
           iAの場合:=カウント-1から0まで
           始める
              コンテキスト:=アイテム[iA];
              Context=nilの場合
                 継続する;
              Context.Connection.IOHandler.WriteBufferClear;
              Context.Connection.IOHandler.InputBuffer.Clear;
              Context.Connection.IOHandler.Close;
              Context.Connection.Connectedの場合
                 Context.Connection.Disconnect;
           終わり;
        ついに
           sftpServidorFTP.Contexts.UnlockList;
        終わり;

sftpServidorFTP.Activeの場合

sftpServidorFTP.Active := False;

終わり;

于 2013-11-20T18:51:22.583 に答える