Delphi 对于IdTCPServer,引发什么异常以进行清理是否重要?

Delphi 对于IdTCPServer,引发什么异常以进行清理是否重要?,delphi,indy,Delphi,Indy,我从很多方面知道,Indy TCP服务器在使用后依赖异常来清理连接 我手中有一台服务器,它的编码方式是,异常由代码处理,不会为Indy重新引发 在一个理想的世界里,我会重写它来满足这个要求。不幸的是,我生活在一个真实的世界里,没有时间和人力资源来解决这个问题 然而,服务器和连接有一个有趣的属性:处理完全在一次OnExecute运行中进行。这意味着我知道一个事实,在OnExecute过程结束时,连接必须已关闭,并且客户端尚未连接 因此,我正在考虑做一个简单的肮脏的把戏:在OnExecute代码的末

我从很多方面知道,Indy TCP服务器在使用后依赖异常来清理连接

我手中有一台服务器,它的编码方式是,异常由代码处理,不会为Indy重新引发

在一个理想的世界里,我会重写它来满足这个要求。不幸的是,我生活在一个真实的世界里,没有时间和人力资源来解决这个问题

然而,服务器和连接有一个有趣的属性:处理完全在一次
OnExecute
运行中进行。这意味着我知道一个事实,在
OnExecute
过程结束时,连接必须已关闭,并且客户端尚未连接

因此,我正在考虑做一个简单的肮脏的把戏:在
OnExecute
代码的末尾,我可以
引发一个通用的Indy异常,比如
eideexception
,这样Indy就可以捕获它并执行其干净的过程

因此,我的问题是,对于Indy清理连接来说,从
OnExecute
引发什么异常是否重要? 我可以提出
EIdException
,或者在这种情况下,最好提出任何其他Indy的异常


请注意,我要问的是,我是否可以接受所有异常并在最后引发一个新异常,而不是重新引发异常的建议路径。

TIdTCPServer
不要求引发异常如果引发异常,服务器将捕获该异常并触发其
OnException
事件。但无论是否引发异常,都会执行清理。如果您确保在
OnExecute
事件存在之前正确关闭连接,那么就这样吧。只要您看到服务器触发其断开连接事件,那么一切都正常。

TIdTCPServer
不要求引发异常如果引发异常,服务器将捕获该异常并触发其
OnException
事件。但无论是否引发异常,都会执行清理。如果您确保在
OnExecute
事件存在之前正确关闭连接,那么就这样吧。只要您看到服务器触发其
OnDisconnect
事件,一切都正常。

任务管理器不会检测到内存泄漏,您所描述的也不会指示内存泄漏。Delphi内存管理器以块的形式分配内存,当对象被释放(正确地)时,它使用的内存仍保留在该块中;一旦内存管理器分配了内存,内存管理器就不会将其返回给操作系统。@KenWhite我知道。我正在使用fastMM检测泄漏。我怀疑是内存碎片导致了这种增长。你要说的是,内存使用率将增加到某一点,并且内存管理器将稳定下来,因为内存管理器将重用自己的块,而不是从操作系统获得更多?我没有说稳定,这完全取决于你的代码。我的观点是任务管理器没有提供任何关于内存泄漏的有意义的信息。FastMM将是检测它们的唯一准确方法-您应该忽略任务管理器所说的任何内容。是的,Delphi内存管理器会在可能的情况下重用块,但是如果这些块用完了,它会重新生成一个更大的块。我只是想澄清一下:我没有依赖任务管理器来查找泄漏。我正在查看fastMM报告(它们是干净的)。但是taskmanager显示我的进程内存消耗越来越大(换言之,数字是:重新开始,大约6MB。几天之后,几十万个连接,大约25MB)。起初我以为是印第在等待异常清理,但现在显然不是这样,雷米回答了。我的另一个想法是一些碎片,我必须进一步研究。我之前的两个评论都是基于你的问题:我可以看到任务管理器中内存使用的增长(没有那么快)。。您的问题文本没有提到FastMM或将其用于内存泄漏检测。如果这就是你要问的,那么文本应该这样说::-)同样,忽略您认为Task Manager告诉您的关于是否存在任何泄漏的任何信息—它的输出在这方面毫无意义。Task Manager不会检测内存泄漏,您所描述的也不会表明内存泄漏。Delphi内存管理器以块的形式分配内存,当对象被释放(正确地)时,它使用的内存仍保留在该块中;一旦内存管理器分配了内存,内存管理器就不会将其返回给操作系统。@KenWhite我知道。我正在使用fastMM检测泄漏。我怀疑是内存碎片导致了这种增长。你要说的是,内存使用率将增加到某一点,并且内存管理器将稳定下来,因为内存管理器将重用自己的块,而不是从操作系统获得更多?我没有说稳定,这完全取决于你的代码。我的观点是任务管理器没有提供任何关于内存泄漏的有意义的信息。FastMM将是检测它们的唯一准确方法-您应该忽略任务管理器所说的任何内容。是的,Delphi内存管理器会在可能的情况下重用块,但是如果这些块用完了,它会重新生成一个更大的块。我只是想澄清一下:我没有依赖任务管理器来查找泄漏。我正在查看fastMM报告(它们是干净的)。但是taskmanager显示我的进程内存消耗越来越大(换言之,数字是:重新开始,大约6MB。几天之后,几十万个连接,大约25MB)。起初我以为是印地在等待异常清理,但这显然是错误的