Я столкнулся с очевидной утечкой ручки, используя Borland / Embarcadero TClientSocket
составная часть. У меня есть приложение, которое создает несколько TThread
экземпляры, каждый из которых создает TClientSocket
Объект динамически подключается к своей цели, отправляет несколько сообщений и затем удаляется. TThread
экземпляры затем удаляются (используя FreeOnTerminate = true
) настройка. Я знаю, что это неэффективно, но это идеально подходит для приложений — максимальное количество TThread
количество экземпляров, которые могут существовать одновременно, ограничено 32. Проблема, с которой я сталкиваюсь, заключается в том, что существует ясная проблема с утечкой дескриптора окон, которую я вижу через диспетчер задач. В попытке выделить проблему я применил ту же проблему в однопоточном смысле, просто динамически создавая TClientSocket
объект и удаление его снова, когда закончите в пределах одного цикла в основном потоке VCL. Это показывает ту же проблему утечки ручки. Я знаю, что компонент устарел, и я знаю, что то, что я делаю, неэффективно, но я не могу понять, почему произошла утечка ручки. Что-нибудь нужно сделать с TClientSocket
объекты перед их удалением для устранения этой утечки дескриптора, или это ошибка в компоненте? Я использую сокет в неблокирующем режиме и назначаю обработчики событий OnConnect
OnDisconnect
а также OnSocketError
,
я использовал TClientSocket
в течение многих лет, включая использование в основном потоке и в рабочем потоке, и я никогда не видел TClientSocket
утечка любых ручек.
Тем не мение, TClientSocket
по умолчанию используется неблокирующий режим, и в этом режиме он использует AllocateHWnd()
создать скрытое окно для получения событий сокета, и AllocateHWnd()
является не потокобезопасный. Не видя вашего фактического кода, это вероятная причина утечек, которые вы видите в коде вашего рабочего потока. Решение этого просто не использовать TClientSocket
является неблокирующим режимом при использовании в рабочем потоке. Вместо этого используйте его в режиме блокировки. Что в любом случае лучше подходит для логики на основе потоков.
Однако это не объясняет утечек, которые вы видите в коде основного потока. Я сомневаюсь TClientSocket
на самом деле виновник, и опять же, не видя ваш настоящий код, трудно сказать наверняка.
Других решений пока нет …