Я работаю над небольшим приложением, которое призвано вызывать некоторые (действительно разнообразные) функции, которые, к сожалению, находятся вне моего контроля и разработаны таким образом, что я не имею понятия, когда выполняются надлежащие действия пользователя.В частности, некоторые из них порождают нить для выполнения своей работы, которая в конечном итоге умирает в будущем.Таким образом, некоторые реализованы синхронно, некоторые реализованы асинхронно, и мой код не знает, какой из них будет.
Цель моего приложения only - запуск этих задач и завершение послезавершение.Поскольку целью является автоматизация, я ожидаю, что она будет вызываться сотнями раз из пакетных файлов за считанные минуты, поэтому я не хочу, чтобы процесс затянулся дольше, чем это возможно.
Поскольку у меня нет сигнала, я могуподождите, ExitThread()
в моем основном потоке, кажется, является подходящим способом, так что любые потоки, порожденные сторонним кодом, в конечном итоге убьют процесс, когда они завершатся.
Так что теперь, чтобы перейти к моему фактическомуПроблема упомянута в названии.:) Чтобы получить надлежащие интерфейсы для моего джига, мне нужно возиться с некоторыми функциями COM.SHParseDisplayName
, IShellFolder::GetUIObjectOf
и куча других.Но долго после того, как я закончу с этими интерфейсами и выпустил их, эти потоки остаются в наличии.Даже после того, как я позвонил CoUninitialize()
.
При проверке моего процесса с помощью Process Explorer большинство этих потоков, похоже, имеют ntdll.dll@EtwTraceMessageVa
в качестве точки входа и застряли в ntdll.dll!ZwAlpcSendWaitReceivePort+0xa
.Очевидно, что случайное завершение потоков с использованием TerminateThread
здесь не вариант.
Как я могу получить COM для завершения этих потоков, когда я закончу с его использованием?Я использую W7 x64 для разработки.