如何在AContext.Connection.Disconnect之后从无限执行中停止TCPServer OnExecute事件?

时间:2014-05-19 13:54:50

标签: delphi indy tcpserver

我手动断开与客户端的连接后,我想停止执行此TCPServerExecute事件:

procedure TMainForm.TCPServerExecute(AContext: TIdContext);
var
  TCPClient : TIdTCPClient;
begin
try
  TCPClient := nil;
  try
    TCPClient := TIdTCPClient.Create(nil);
    if aConditionIsMet then begin 
      AContext.Connection.IOHandler.WriteLn('Disconnected from server.');
      AContext.Connection.Disconnect;
      Exit;
    end;
  finally
    FreeAndNil(TCPClient);
  end;
except on e : Exception do
  begin
    MainForm.Log('error in Execute=' + e.Message);
  end;
end;
end;

在客户端一切都很好,但在服务器端我无限循环TCPServerExecute。我输错了什么?如何在输入TCPServerExecute后停止执行AContext.Connection.Disconnect

1 个答案:

答案 0 :(得分:2)

循环继续,因为没有正确处理Indy异常。

删除异常处理程序,或在记录后重新引发异常:

except 
  on e : Exception do
  begin
    MainForm.Log('error in Execute=' + e.Message);
    raise;
  end;
end;

P.S。从服务器线程访问MainForm不是线程安全的。有许多解决方案可以改进这个代码(TThread.Queue就是其中之一)。