Delphi 为什么Indy 10的echo服务器在客户端断开连接时CPU使用率较高?

Delphi 为什么Indy 10的echo服务器在客户端断开连接时CPU使用率较高?,delphi,indy,Delphi,Indy,当我断开echo客户端时,如: EchoClient1.Disconnect; 客户端断开连接很好。。。 但EchoServer甚至不注册客户端断开连接 它最终会导致高进程使用率 在每一个例子和每一个文档中,它都说调用EchoClient.Disconnect就足够了 有人知道吗 我在Win7中工作,这会有问题吗 服务器代码: procedure TForm2.EServerConnect(AContext: TIdContext); begin SrvMsg.Lines.Add('ECH

当我断开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从未执行

使用调试器自己查找

如果您的程序CPU使用率很高,则假定它卡在循环中。调试器可以帮助您找出哪个循环以及原因。当服务器在调试器中运行并显示问题时,请按暂停按钮。调试器将中断您的程序并向您显示程序正在执行的行。使用调用堆栈显示程序是如何到达该行的。找到你怀疑是罪魁祸首的回路。继续并暂停你的程序几次,看看你是否总是停在同一个循环中的某个地方。现在分析代码,找出循环不终止的原因

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


确保您正在使用。不要使用您的Delphi副本附带的版本。

使用调试器自己查找

如果您的程序CPU使用率很高,则假定它卡在循环中。调试器可以帮助您找出哪个循环以及原因。当服务器在调试器中运行并显示问题时,请按暂停按钮。调试器将中断您的程序并向您显示程序正在执行的行。使用调用堆栈显示程序是如何到达该行的。找到你怀疑是罪魁祸首的回路。继续并暂停你的程序几次,看看你是否总是停在同一个循环中的某个地方。现在分析代码,找出循环不终止的原因

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


确保您正在使用。不要使用Delphi副本附带的版本。

显示的代码不是线程安全的。任何提供对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;

显示的代码不是线程安全的。任何提供对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;

需要显示一些服务器端代码只是将Active设置为true且简单的OnConnect和onDisconnect过程…需要显示一些服务器端代码只是将Active设置为true且简单的OnConnect和onDisconnect过程…永远不要使用Indy的开发快照,其发布版本足够不稳定。@用户,Indy网站上唯一可用的发布版本是6年前的版本。Delphi 2010附带的版本。从SVN下载。我已经做了所有这些。。。我知道问题是什么,我只是不知道如何解决它!即使客户机断开连接,服务器也不会断开连接!服务器上的客户端线程从未关闭!一定是某种虫子,或者@罗布·肯尼迪:嘿,即使是夜间快照也已经过时了,而且这也不是我们第一次打破发布版本。如果你不喜欢网站上的夜间快照,那么只需运行svn更新就可以创建自己的快照@大师,当你进行调试时,你学到了什么?您的程序是否陷入循环?那个循环试图做什么?你的节目是怎么做到的?如果客户端线程没有关闭,它在做什么?它应该如何调用OnDisconnect?永远不要使用Indy的开发快照,它的发布版本足够不稳定。@用户,Indy网站上唯一可用的发布版本是六年前的版本。Delphi 2010附带的版本。从SVN下载。我已经做了所有这些。。。我知道问题是什么,我只是不知道如何解决它!即使客户机断开连接,服务器也不会断开连接!服务器上的客户端线程从未关闭!一定是某种虫子,或者@罗布·肯尼迪:嘿,即使是夜间快照也已经过时了,而且这也不是我们第一次打破发布版本。我建议在库依赖性很少的情况下切换到ICS。如果你不喜欢的话 他每晚从网站上抓拍快照,然后通过运行svn更新来创建自己的快照@大师,当你进行调试时,你学到了什么?您的程序是否陷入循环?那个循环试图做什么?你的节目是怎么做到的?如果客户端线程没有关闭,它在做什么?它应该如何达到调用OnDisconnect的程度?