既知の問題があります。IdTCPServerは、非アクティブ化しようとしている間にハングします。私はそのような問題に関する記事をたくさん読んでおり、私はデッドロックが起こっていることに気付いています。しかし、問題の原因となるコードを正確に理解することは難しいです。私のアプリにはウィンドウがないので、VCLコンポーネントへの同期呼び出しが理由ではありません。 2つのイベントハンドラOnConnectとOnExecuteを取得しました。問題はOnConnectに表示されます。コードは:
別のTIdTCPServerのデッドロック状況
TMyServer = class
...
private
FServer: TIdTCPServer;
...
end;
TMyServer.ServerConnect(AContext...); //onconnect
begin
try
if not Condition then
begin
...
AContext.Connection.Disconnect;
Stop;
end
else Start;
except
on E: Exception do
if E is EIdException then raise;
...
end;
TMyServer.Start;
begin
...
FServer.active := true;
FServer.StartListening;
...
end;
TMyServer.Stop;
begin
...
FServer.StopListening;
FServer.Active := false;
...
end;
TMyServer.ServerExecute(AContext...); //onexecute
begin
LLine := AContext.Connection.IOHandler.ReadLn;
case (LLine) of
...
end;
end;
ServerExecuteのコードは非常に巨大であるので、私はそれをここに投稿しないでしょう。それに問題はないと思う。
クライアントがサーバーに接続し、条件がfalseの場合、サーバーはこのクライアントの接続を切断し、回線でハングアップしますFServer.Active := false;
私は既にコードからすべてのログを除外しました。ログファイル)。したがって、イベントハンドラには計算だけがあり、デッドロックの原因となるものはありません。 Indy例外の再発生について読んだことがありますが、それは私にも役立ちませんでした。
私はこの状況の目的を完全には理解していないと思うので、助けと説明を感謝します。
ありがとうレミー。あなたは答えが私のためにすべてを明確にしました。 – gator88