10
votes

Est-il nécessaire d'arrêter explicitement tous les threads avant de quitter une application Win32?

J'ai une application Win32 natif VC ++ que lors de la saisie WinMain () 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é.

Ce blog post dit qu'une application .NET ne se terminera pas dans ce cas car l'autre thread est toujours en marche. Est-ce que la même chose s'applique aux applications Native Win32?

Dois-je arrêter tous les discussions avant de sortir?


0 commentaires

5 Réponses :


-2
votes

Réponse courte: oui


0 commentaires


2
votes

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.

Toutefois, il est possible qu'un filetage principal soit terminé pendant que les autres threads fonctionnent, ce qui entraîne l'application est toujours en cours d'exécution . Si vous appelez Quitterthread (pas Quitter ou ExitProcess ) 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 , et cela signifie que tous les threads doivent être terminés.

corrigez-moi si c'est faux.


1 commentaires

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).



3
votes

Le court est le cas: Pour un processus Native Win32 à terminer, une des deux conditions doit être remplie:

  • quelqu'un appelle la sortie de sortie ou de la traduction de processus.
  • Tous les threads Sortent (en revenant de leur threadproc (y compris le WinMainentryPoint qui est le premier fil créé par Windows)), fermez (en appelant ExitThread) ou terminé (quelqu'un appelle Terminatethread).

    (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).

    Le temps C-Runtime impose différentes conditions: pour une application C / C ++ à terminer, vous devez soit:

    • retour de Main (ou WinMain).
    • appel d'appel ()

      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.

      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.


0 commentaires

0
votes

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.

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 ().


0 commentaires