首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用多个TClientSocket实例导致Windows处理泄漏的C++应用程序

使用多个TClientSocket实例导致Windows处理泄漏的C++应用程序
EN

Stack Overflow用户
提问于 2013-03-13 04:17:38
回答 1查看 557关注 0票数 2

我在使用Borland/Embarcadero TClientSocket组件时遇到了一个明显的句柄泄漏。我有一个创建多个TThread实例的应用程序,每个实例动态创建一个TClientSocket对象,连接到它的目标,发送几条消息,然后被删除。然后删除TThread实例(使用FreeOnTerminate = true)设置。我知道这很低效,但它非常适合应用程序的需要-能够同时存在的TThread实例的最大数量限制为32个。我看到的问题是有一个清晰的窗口句柄泄漏问题,我可以通过任务管理器看到。为了隔离问题,我在单线程意义上应用了相同的问题,只是动态地创建了一个TClientSocket对象,并在主VCL线程中的单个循环内完成时再次删除它。这表现出相同的句柄泄漏问题。我知道组件被弃用,我知道我所做的是低效的,但我不明白为什么会有句柄泄漏。在删除TClientSocket对象之前,是否需要对它们做些什么来消除这个句柄泄漏,或者这是组件中的一个错误?我在非阻塞模式下使用套接字,并将事件处理程序分配给OnConnectOnDisconnectOnSocketError

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-03-13 13:20:12

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

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

然而,这并不能解释你在主线程代码中看到的漏洞。我怀疑TClientSocket是真正的罪魁祸首,再说一次,在没有看到实际代码的情况下,很难确定。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15371271

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档