当我断开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”永远不会执行!?!?
答案 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;