我有一个Win32本地VC ++应用程序,进入WinMain()
启动一个单独的线程,然后做一些有用的工作,而其他线程正在运行,然后只是退出WinMain()
– 另一个线程是不明确停止。
这个博客文章说,在这种情况下,.NET应用程序不会终止,因为另一个线程仍在运行。 这同样适用于本机Win32应用程序吗?
在退出之前是否必须停止所有线程?
是的,否则你的应用程序可能会挂起。 我推荐阅读Raymond Chen关于这个主题的优秀博客文章:
它的缺点是:对于本机Win32进程终止,必须满足两个条件之一:
(第一个条件实际上与第二条相同:ExitProcess和TerminateProcess,作为它们清理的一部分,都在进程中的每个线程上调用TerminateThread)。
c运行时会施加不同的条件:要使C / C ++应用程序终止,您必须:
调用exit()或从main()返回都会导致c-runtime调用ExitProcess()。 C&C ++应用程序如何在不清除线程的情况下退出。 我个人认为这是一件坏事。
但是,非微不足道的Win32进程永远不能终止,因为许多完美的,合理的Win32子系统创建工作线程。 winsock,ole等。而且不要提供任何方式来使这些线程自发地关闭。
不,WinMain返回时,进程将被终止,这意味着进程产生的所有线程应该被终止,尽管它们可能没有被正常关闭。
但是, 主线程在其他线程正在运行时可能会终止,从而导致应用程序仍在运行 。 如果您在WinMain中调用了ExitThread
(不是exit
或ExitProcess
),并且有正在运行的线程(最终由主线程创建),那么您可能会观察到此行为。 尽管如此,只要在WinMain中返回就会调用ExitProcess
,这意味着所有的线程都应该被终止。
纠正我,如果它是错的。
我想你可以先关闭所有的窗口(这样用户不会看到你的应用程序),然后设置退出标志,你的线程应该定期检查标志,一旦发现设置,线程应该返回。
设置标志后,主线程可以调用:: WaitForSingleObject()或:: WaitForMultipleObjects()一段时间(比如三秒),如果线程没有返回,只需要通过:: TerminateThread()来终止它们。
简短的回答:是的