当客户端断开连接时,为什么Indy 10的echo服务器具有很高的CPU使用率?

时间:2010-12-28 22:25:36

标签: delphi indy

当我断开echo客户端时:

EchoClient1.Disconnect;

客户断开连接... 但EchoServer甚至不会注册客户端断开连接 并最终导致高流程使用!?!?

在每个示例和每个文档中都说调用EchoClient.Disconnect就足够了!

任何人,任何想法?

(我在Win7工作,这可能是个问题吗?)

服务器代码:

procedure TForm2.EServerConnect(AContext: TIdContext);
begin
  SrvMsg.Lines.Add('ECHO Client connected !');
end;

procedure TForm2.EServerDisconnect(AContext: TIdContext);
begin
 SrvMsg.Lines.Add('ECHO Client disconnected !');
end;

问题是“TForm2.EServerDisconnect”永远不会执行!?!?

2 个答案:

答案 0 :(得分:3)

使用调试器自行查找。

如果您的程序具有较高的CPU使用率,则假设它处于循环中。调试器可以帮助您找出哪个循环,以及为什么。当服务器在调试器中运行并出现问题时,请按“暂停”按钮。调试器将中断您的程序并向您显示程序正在执行的行。使用调用堆栈向您显示程序如何到达该行。找到你怀疑是罪魁祸首的循环。再次暂停和暂停程序几次,看看是否总是在同一个循环中的某个地方停止。现在分析代码以找出循环未终止的原因。

您可能需要激活其他线程;主GUI线程可能正在等待GetMessage的调用,这是正常的。

确保您使用the latest version of Indy。请勿使用Delphi副本附带的版本。

答案 1 :(得分:2)

显示的代码不是安全的。提供对TIdContext对象的访问的任何Indy事件都在运行该对象的工作线程的上下文中触发。必须在主线程的上下文中完成对UI组件的访问。如果你不遵守这条规则,就会发生各种意想不到的坏事。您需要与主线程同步,例如:

uses
  ..., IdSync;

procedure TForm2.EServerConnect(AContext: TIdContext);
begin
  TIdNotify.NotifyMethod(ClientConnected);
end;

procedure TForm2.ClientConnected;
begin
  SrvMsg.Lines.Add('ECHO Client connected !');
end;

procedure TForm2.EServerDisconnect(AContext: TIdContext);
begin
  TIdNotify.NotifyMethod(ClientDisconnected);
end;

procedure TForm2.ClientDisconnected;
begin
  SrvMsg.Lines.Add('ECHO Client disconnected !');
end;