COM函数产生不会消失的线程

问题描述:

我正在研究一个小应用程序,这个应用程序旨在调用一些(真正多样化的)功能,这些功能可悲地超出了我的控制范围,并且以这样的方式进行设计,用户操作完成。特别是其中的一些产生了一个线程来完成他们的工作,最终将在未来的某个时间点死去。所以有些是实现同步,有些是实现异步,我的代码不知道它会是哪些。COM函数产生不会消失的线程

仅限我的应用程序的目的是启动这些任务,并在完成后终止。由于目的是自动化,所以我预计它会在短时间内从批处理文件中调用100次,所以我不希望这个过程再拖延下去。

因为我没有信号,所以我可以等待,我的主线程上的ExitThread()似乎是要走的路,这样任何由外部代码产生的线程最终都会在终止时终止进程。

因此,现在来看看我在标题中提到的实际问题。 :)为了让我的夹具获得适当的界面,我需要解决一些COM功能。 SHParseDisplayNameIShellFolder::GetUIObjectOf和一堆其他人。但是在我完成这些接口并释放它们之后很久,这些线程仍然存在。即使我打电话给CoUninitialize()

当使用Process Explorer检查我的进程时,这些线程中的大多数似乎将[email protected]作为入口点,并且卡在ntdll.dll!ZwAlpcSendWaitReceivePort+0xa中。显然,使用TerminateThread随机终止线程不是一个选项。

当我完成使用它时,如何获得COM来终止这些线程?我正在使用W7 x64进行开发。

我明白了这个问题,这是一个明显的例子,所有的文档都在某个地方,而不是你要查找的地方,在这个问题上有一个相关的主题有blog post,这使我找到了缺失的一块。

我的应用程序会弹出一个文件(因此在我的代码没有ShellExecute),然后允许一个调用命令的IContextMenu。然而,像properties这样的一些动词是我的问题所讲的古怪的东西:他们产生了另一个线索,并没有通知或明显的方式来阻止它。

使用SHSetExplorerInstance在链接的帖子中提到解决了我的问题。 :)

那些线程不属于COM。它们属于本机Windows线程池。它们被设计用来坚持使用,以便在必要时可以重复使用。假设没有挂起的异步回调,你应该能够干净地关闭。线程池将负责及时销毁线程。

+0

奇怪,没有得到你回复的通知。无论哪种方式,我的'主'线程已经死了,它故意产生的线程已经死了,但是我留下了一个死循环,其中有一堆线程,我无法影响。我恐怕没有看到他们的任何痕迹被毁灭。 – Stigma 2010-11-14 01:22:00

+0

您可能有一个COM接口引用计数错误或其他资源上的其他东西。无论哪种方式,如果您使用C运行时,它应该在您的主线程从main或wWinMain返回后(无论其他线程可能正在运行)终止进程。它通过调用exit函数来完成此操作。如果你没有使用C运行时,那么你可以调用ExitProcess函数来达到同样的目的。 – 2010-11-15 13:11:26

+0

我知道这一切。你读过这个问题了吗?它确切地说明了为什么我不能依赖ExitProcess并且如果可能的话想切换到ExitThread()。 - 关于引用计数..我介绍了代码,关注了创建麻烦线程的时间,但涉及命令的接口在几行后发布。 – Stigma 2010-11-16 07:42:42