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