Je veux dire que si tu veux qu'un thread dise à l'autre de se terminer proprement, il faut le moyen de le signaler.
Cela peut se faire par des outils de synchronisation (malheureusement incompatibles avec Select() et WSAWaitForMultipleEvents()) ou une vagiable globale modifiée, par exemple
volatile bool g_bQuitThread;
qui passe à true quand on veut que le thread se termine.
Mais pour cela, il faut vérifier régulièrement que ladite variable a changé, et c'est là que les timeouts prennent tout leur intéret: plutôt que d'attendre indéfiniement qu'il se passe quelque chose sans jamais consulter la variable, on la vérifie tous les X (2 secondes par exemple, il suffit de régler le timeout à 2000ms et de vérifier la variable entre chaque appel à la fonction d'attente: si celle-ci indique que le thread doit se terminer, on sort de la boucle).
Ainsi, dans le thread principal:
1 2 3
| g_bQuitThread = true;
WaitForSingleObject(hThread, INFINITE);//on lui dit d'attendre indéfiniement,
//mais le thread attendu devrait se terminer au bout de 2 secondes max |
Partager