2

TClientSocket我在使用 Borland/Embarcadero组件时遇到了明显的手柄泄漏。我有一个创建多个TThread实例的应用程序,每个实例TClientSocket动态创建一个对象,连接到它的目标发送一些消息,然后被删除。然后TThread删除实例(使用FreeOnTerminate = true)设置。我知道这效率低下,但它完美地满足了应用程序的需求——TThread能够同时存在的最大实例数限制为 32。我看到的问题是我可以看到一个明显的 windows 句柄泄漏问题通过任务管理器。为了隔离问题,我在单线程意义上应用了相同的问题,只是动态创建了一个TClientSocket对象并在主 VCL 线程中的单个循环内完成后再次删除它。这表现出相同的手柄泄漏问题。我知道该组件已被弃用,并且我知道我正在做的事情效率低下,但我不明白为什么会有句柄泄漏。在删除对象之前是否需要对对象执行任何操作TClientSocket以消除此句柄泄漏,或者这是组件中的错误?我在非阻塞模式下使用套接字并将事件处理程序分配给OnConnect OnDisconnectOnSocketError

4

1 回答 1

1

我已经使用TClientSocket了很多年,包括在主线程和工作线程中的用法,我从未见过TClientSocket泄漏任何句柄。

但是,TClientSocket默认为非阻塞模式,并且在该模式下它用于AllocateHWnd()创建隐藏窗口来接收套接字事件,并且AllocateHWnd()不是线程安全的。在没有看到您的实际代码的情况下,这可能是您在工作线程代码中看到的泄漏的原因。解决方案就是TClientSocket在工作线程中使用时不使用非阻塞模式。改为在阻塞模式下使用它。无论如何,这更适合基于线程的逻辑。

但是,这并不能解释您在主线程代码中看到的泄漏。我怀疑TClientSocket实际上是罪魁祸首,再说一次,没有看到你的实际代码,很难确定。

于 2013-03-13T05:20:11.957 回答