COM-функции порождают потоки, которые не исчезают - PullRequest
2 голосов
/ 12 ноября 2010

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

Цель моего приложения only - запуск этих задач и завершение послезавершение.Поскольку целью является автоматизация, я ожидаю, что она будет вызываться сотнями раз из пакетных файлов за считанные минуты, поэтому я не хочу, чтобы процесс затянулся дольше, чем это возможно.

Поскольку у меня нет сигнала, я могуподождите, ExitThread() в моем основном потоке, кажется, является подходящим способом, так что любые потоки, порожденные сторонним кодом, в конечном итоге убьют процесс, когда они завершатся.

Так что теперь, чтобы перейти к моему фактическомуПроблема упомянута в названии.:) Чтобы получить надлежащие интерфейсы для моего джига, мне нужно возиться с некоторыми функциями COM.SHParseDisplayName, IShellFolder::GetUIObjectOf и куча других.Но долго после того, как я закончу с этими интерфейсами и выпустил их, эти потоки остаются в наличии.Даже после того, как я позвонил CoUninitialize().

При проверке моего процесса с помощью Process Explorer большинство этих потоков, похоже, имеют ntdll.dll@EtwTraceMessageVa в качестве точки входа и застряли в ntdll.dll!ZwAlpcSendWaitReceivePort+0xa.Очевидно, что случайное завершение потоков с использованием TerminateThread здесь не вариант.

Как я могу получить COM для завершения этих потоков, когда я закончу с его использованием?Я использую W7 x64 для разработки.

Ответы [ 2 ]

4 голосов
/ 12 ноября 2010

Эти темы не принадлежат COM.Они принадлежат к пулу потоков Windows.Они разработаны так, чтобы их можно было использовать, чтобы при необходимости их можно было использовать повторно.Предполагая, что нет ожидающих асинхронных обратных вызовов, вы должны быть в состоянии аккуратно завершить работу.Пул потоков позаботится о своевременном уничтожении потоков.

0 голосов
/ 23 ноября 2010

Я выяснил проблему, и это был очевидный случай, когда вся документация была где-то, но не там, где вы ищете, и у некоторой связанной темы было сообщение в блоге по этой проблеме, которое привело меня на недостающий кусок.

Мое приложение выскакивает IContextMenu файла (отсюда и нет ShellExecute в моем коде), а затем позволяет вызывать команду. Тем не менее, некоторые глаголы, такие как properties, - это странности, о которых был мой вопрос: они порождают другую ветку и не дают уведомления или очевидного способа заблокировать ее.

Использование SHSetExplorerInstance, как упомянуто в связанном посте, исправило мои проблемы. :)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...