J'ai une application Win32 natif VC ++ que lors de la saisie Dois-je arrêter tous les discussions avant de sortir? P> WinMain () CODE> Démarre un thread distinct, puis un travail utile alors que d'autres threads sont en cours d'exécution, il en résulte simplement WinMain () < / code> - l'autre thread n'est pas explicitement arrêté. P>
5 Réponses :
Réponse courte: oui p>
Oui, vous devez simplement sortir ou terminer le thread principal via Mais veuillez notamment noter que si vous revenez correctement à partir de la fonction code> principale code> ou Quitterthread CODE> ou Terminatethread code>, sinon votre application peut ne pas être complètement arrêtée. Je recommande de lire les excellents poteaux de blog de Raymond Chen sur ce sujet: P>
winmain code>, le processus s'éteindra comme décrit par le Documentation de l'API ExitProcess et le dernier message de Raymond Chen en cours de liaison ci-dessus! p>
Non, lorsque WinMain revient, le processus sera résilié, ce qui signifie que tous les threads engendrés par le processus doivent être résiliés bien qu'ils ne soient pas fermés gracieusement. P>
Toutefois, corrigez-moi si c'est faux. P> Quitterthread code> (pas Quitter code> ou ExitProcess code>) dans WinMain, et il y a des threads exécutés (éventuellement créés par le fil principal), puis Vous pouvez observer ce comportement. Néanmoins, il suffit de revenir à WinMain appellera exitProcess code>, et cela signifie que tous les threads doivent être terminés. P>
L'explication donnée ici est 100% correcte. J'ai validé le thread WinMain est créé par C Runtime et lorsque le thread a quitté le temps d'exécution C appelé ExitProcess qui a provoqué la terminaison de l'ensemble de l'application (y compris d'autres threads).
Le court est le cas: Pour un processus Native Win32 à terminer, une des deux conditions doit être remplie: p>
(la première condition est réellement la même que la 2e: ExitProcess et TerminerProcess, dans le cadre de leur nettoyage, les deux terminaux terminaux sur chaque thread du processus). P>
Le temps C-Runtime impose différentes conditions: pour une application C / C ++ à terminer, vous devez soit: P>
Appeler la sortie () ou revenir à partir de Main () Cause les deux provoquent le Time C-Runtime de Call ExitProcess (). Voici comment C & C ++ applications quittent sans nettoyer leurs fils. Personnellement, je pense que c'est une mauvaise chose. P>
Toutefois, des processus Win32 non triviaux ne peuvent jamais se terminer car beaucoup de sous-systèmes de Win32 parfaitement, sinon raisonnables, créent des threads de travailleur. WINSOCK, OLE, etc. et ne fournissez aucun moyen de provoquer la fermeture spontanément de ces fils. P>
Je pense que vous pouvez d'abord fermer toutes vos fenêtres (l'utilisateur ne verra pas votre application), puis définissez un drapeau pour la sortie, votre thread doit vérifier le drapeau périodiquement et une fois trouvé défini, le fil devrait revenir. p>
Après avoir réglé le drapeau, votre fil principal pourrait appeler :: WaitforsingleObject () ou :: WaitformultiPleObjects () pendant un moment (par exemple, trois secondes), si le ou les fils ne reviennent pas, il suffit de les tuer par :: Terminatethread (). p>