c ++ builder xe2 — приложение C ++, вызывающее утечку Windows Handle при использовании нескольких экземпляров TClientSocket

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

2

Решение

я использовал TClientSocket в течение многих лет, включая использование в основном потоке и в рабочем потоке, и я никогда не видел TClientSocket утечка любых ручек.

Тем не мение, TClientSocket по умолчанию используется неблокирующий режим, и в этом режиме он использует AllocateHWnd() создать скрытое окно для получения событий сокета, и AllocateHWnd() является не потокобезопасный. Не видя вашего фактического кода, это вероятная причина утечек, которые вы видите в коде вашего рабочего потока. Решение этого просто не использовать TClientSocket является неблокирующим режимом при использовании в рабочем потоке. Вместо этого используйте его в режиме блокировки. Что в любом случае лучше подходит для логики на основе потоков.

Однако это не объясняет утечек, которые вы видите в коде основного потока. Я сомневаюсь TClientSocket на самом деле виновник, и опять же, не видя ваш настоящий код, трудно сказать наверняка.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]