Clôture de fil à l'aide de ExitThread - C
J'ai un programme simple qui crée un thread, boucles de vingt fois, et puis il fait un appel de fermer lui-même et effectuer le nettoyage nécessaire.
Quand je déboguer le programme de ce qu'il atteigne la ExitThread(); la méthode et les pauses, en ignorant le printf(); j'ai mis en place après son signal pour moi, c'est fermé.
Est-ce normal ou suis-je oublié de faire quelque chose? Je suis nouveau sur le filetage à l'aide de C.
Main()
void main()
{
Time t;
int i = 0;
StartTimer();
for(i = 0; i < 20; i++)
{
t = GetTime();
printf("%d.%.3d\n", t.seconds, t.milliseconds);
Sleep(100);
}
StopTimer();
}
De Création De Thread
void StartTimer()
{
DWORD threadId;
seconds = 0;
milliseconds = 0;
//Create child thread
hThread = CreateThread(
NULL, //lpThreadAttributes (default)
0, //dwStackSize (default)
ThreadFunc, //lpStartAddress
NULL, //lpParameter
0, //dwCreationFlags
&threadId //lpThreadId (returned by function)
);
//Check child thread was created successfully
if(hThread == NULL)
{
printf("Error creating thread\n");
}
}
Fil À Proximité
void StopTimer()
{
DWORD exitCode;
if(GetExitCodeThread(hThread,&exitCode) != 0)
{
ExitThread(exitCode);
printf("Thread closed");
if(CloseHandle(hThread))
{
printf("Handle closed");
}
}
}
Edit:
J'ai réalisé que ExitThread() arrête l'exécution du thread, j'ai donc tenté d'utiliser une autre méthode pour l'arrêt de la minuterie, mais je suis toujours à gauche avec le même résultat.
void StopTimer()
{
WaitForSingleObject(hThread,INFINITE);
}
Solution:
La raison pour laquelle le programme a été l'arrêt au WaitForSingleObject() de l'appel et ne progresse peu importe combien de temps il a fallu à cause de l'opération, il attendait a une boucle infinie.
Il serait en attente d'une boucle infinie à la fin, pas la meilleure chose à faire. Modification du délai de WaitForSingleObject() pour quelque chose de plus raisonnable, comme 100 admis au programme de s'exécuter normalement.
Merci pour tous les commentaires.
- Votre boucle (juste après StartTimer) n'est pas en cours d'exécution sur le fil que vous avez créé; il est en cours d'exécution sur le thread principal. Est-ce que vous est-il destiné? Quelle que soit la méthode ThreadFunc points seront en cours d'exécution sur le fil
- Je crois que j'ai confondu moi-même, mon but était de créer un thread, effectuer une opération 20 fois, et puis la sortie du thread avant de fermer complètement le programme.
- Ouais, c'est pas ce que vous faites, ce que vous pouvez faire est de commencer la discussion avec le point d'entrée de ThreadFunc, et puis à l'intérieur de threadfunc vous auriez exécuter la tâche.
Vous devez vous connecter pour publier un commentaire.
Oui c'est "normal", en appelant ExitThread, vous dites de windows que vous avez terminé avec cette thread appelant, de sorte que le reste du code n'est pas appelé. C'est un peu comme appeler exit(0).
Personnellement, je ne voudrais pas l'utiliser comme ça. Le reste du code est OK, vous êtes correctement le nettoyage du fil, il suffit de sortir de votre fil fonctionner normalement.
C'est normal, parce que ExitThread réellement quitter le thread en cours, de sorte qu'il ne sera jamais de retour et les instructions suivantes ne sera jamais exécutée.
Par le chemin, vous devriez ne jamais appeler directement ExitThread (sauf si vous savez vraiment ce que vous faites): il suffit de le retourner à partir de la fonction de thread.
Puis, si vous utilisez la bibliothèque d'exécution C, vous ne devez pas utiliser le raw fil API, mais la bibliothèque runtime C des fonctions comme _beginthread et _beginthreadex.
La ExittThread fonction se termine le thread APPELANT -- immédiatement.
Depuis que vous appelez StopTimer dans le contexte du thread principal, lorsqu'il appelle à la sortie du fil, il se termine le thread principal et avec elle il termine le processus.
Vous pouvez créer un Événement au début de ThreadFunc, comme hStop, et attendre de cet événement pour les pas de temps à chaque tour de boucle. ensuite, vous pouvez utiliser SetEvent() dans le thread principal pour demander le thread de s'arrêter.
Note Pour un fichier exécutable lié avec LIBCMT.LIB, n'appelez pas le Win32 ExitThread API; cela empêche le système d'exécution de récupérer les ressources allouées. _endthread and_endthreadex récupérer alloué thread ressources et ensuite appeler ExitThread.