Windows API безопасного завершения потока - PullRequest
2 голосов
/ 23 июня 2011

У меня есть приложение Delphi на Windows XP. Это приложение работает с 100 потоками. В некоторых случаях мне приходится завершать поток с полностью отбрасываемым стеком потока.

Я искал функцию из WinAPI вроде terminatethread , но это не безопасно и: Windows Server 2003 и Windows XP / 2000: начальный стек целевого потока не освобождается, что приводит к утечке ресурсов.

Ответы [ 2 ]

12 голосов
/ 23 июня 2011

Там нет такой функции. Такая функция не может существовать. Windows не может знать, какие ресурсы должны быть убраны этим потоком, и она не могла знать, как это сделать. Это ответственность вашего приложения.

Для меня это звучит так, будто вы идете по этому поводу неправильно. Вы должны прерывать нить кооперативным способом без применения силы. Все остальное может привести к утечкам и, скорее всего, к другим более серьезным проблемам.

1 голос
/ 27 июня 2011

Если все потоки вашего приложения написаны на Delphi-коде, рассмотрите возможность использования OmniThreadLibrary и использования предоставляемых им сервисов вместо сырых Win32 API или встроенных функций TThread, что довольно неплохо в последних версиях Delphi.

Однако для сигнализации потоков и их отключения, особенно там, где не все потоки создаются и управляются объектами Delphi THread, вам придется выполнить большую часть проектирования, и вам, вероятно, придетсяобъедините несколько примитивов Win32 вместе, чтобы создать достойное решение.Я бы использовал событие Win32 и сигнальные потоки, написанные на C / C ++, используя дескриптор события Win32, например.

Для чистой 100% -ной кодовой базы Delphi я просто использовал бы все, что хорошо протестировано, и использовал бы API-интерфейсы TThread или OmniThreadLibrary вместо того, чтобы переходить к сырому Win32 API.

...