我正在开发一个小型应用程序,该应用程序旨在调用一些(非常不同的)功能,遗憾的是这些功能超出了我的控制范围,并且其设计方式使我不知道何时完成正确的用户操作。特别是其中一些会产生一个线程来完成它们的工作,该线程最终会在未来的某个时刻死亡。所以有些是同步实现的,有些是异步实现的,而我的代码不知道会是哪一个。
我的应用程序的唯一目的是启动这些任务并在完成后终止。由于目的是自动化,我预计它会在短时间内从批处理文件中调用数百次,因此我不希望该过程停留的时间超过绝对可能的时间。
由于我没有可以等待的信号,因此主线程上的 ExitThread()
似乎是可行的方法,因此外部代码生成的任何线程最终都会杀死该进程当它们终止时。
现在来谈谈标题中提到的我的实际问题。 :) 为了获得适合我的夹具的正确接口(interface),我需要使用一些 COM 函数。 SHParseDisplayName
、IShellFolder::GetUIObjectOf
以及其他一些。但在我完成这些接口(interface)并释放它们之后很长一段时间,这些线程仍然存在。即使在我调用了 CoUninitialize()
之后。
使用 Process Explorer 检查我的进程时,大多数线程似乎都以 ntdll.dll@EtwTraceMessageVa
作为入口点,并且卡在 ntdll.dll!ZwAlpcSendWaitReceivePort+0xa 中
。显然,使用 TerminateThread
随机终止线程在这里不是一个选项。
当我使用完 COM 后,如何才能终止这些线程?我正在使用 W7 x64 进行开发。
最佳答案
这些线程不属于 COM。它们属于 native Windows 线程池。它们被设计为可保留,以便在必要时可以重复使用。假设没有挂起的异步回调,您应该能够干净地关闭。线程池将负责及时销毁线程。
关于c++ - COM 函数产生不会消失的线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4161839/