gpt4 book ai didi

C++ 应用程序使用多个 TClientSocket 实例导致 Windows 句柄泄漏

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:28:36 24 4
gpt4 key购买 nike

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

最佳答案

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

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

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

关于C++ 应用程序使用多个 TClientSocket 实例导致 Windows 句柄泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15371271/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com