2009-12-16 5 views
2

Je comprends le problème de simplement tuer le thread directement (via AfxEndThread ou d'autres moyens), et j'ai vu les exemples utilisant des objets CEvent pour signaler le thread et ensuite faire nettoyer le thread lui-même. Le problème que j'ai est que l'utilisation de CEvent pour signaler le thread semble nécessiter une boucle où vous vérifiez si le thread est signalé à la fin de la boucle. Le problème est que mon thread ne boucle pas. Cela fonctionne et le traitement peut prendre du temps (c'est pourquoi j'aimerais pouvoir l'arrêter).Arrêt d'un thread MFC

Aussi, si je devais juste tuer le fil, je me rends compte que tout ce que j'ai alloué n'aura pas une chance de se nettoyer. Il me semble que tous les locaux que j'utilise et qui ont mis des choses sur le tas ne seront pas en mesure de se nettoyer. Est-ce le cas?

Répondre

0

Votre thread est-il déjà sorti? Si c'est le cas, vous pouvez définir un événement dans le thread à la sortie et attendre que le processus principal attende cet événement via waitforsingleevent. Il est préférable de faire avec un délai d'attente afin que le processus principal ne semble pas se bloquer lors de la fermeture. Lors de l'événement timeout, tuez le thread via AfxKillThread. Cependant, vous devrez déterminer ce qu'est un délai raisonnable.

Puisque vous ne faites pas de boucle dans le thread, cela me semble être le seul moyen de le faire. Bien sûr, vous pourriez quelque chose comme définir un indicateur booléen dans le processus principal et que le thread vérifie périodiquement ce drapeau, mais alors votre code de thread sera jonché de "if (! CanRun) return;" code de type.

Si le thread ne se ferme jamais, alors AfxKillThread/AfxTerminateThread est le seul moyen d'arrêter le thread.

0

Les locals seraient placés sur la pile et, par conséquent, SERAIENT libérés en forçant le thread à se fermer (je pense). Les destructeurs ne seront pas appelés et les sections critiques du thread ne seront pas libérées.

Si le thread ne fait que des choses avec des types de données simples sur la pile, cependant, c'est une chose sûre à faire.

2

Il n'y a pas de connaissance magique secrète ici.

Vérifiez simplement l'objet d'événement périodiquement tout au long du code de fonction, où vous estimez qu'il est sûr de quitter.