Bonjour,
Je poste un topic juste pour vous demander votre façon de gérer les threads (mais en particulier: la façon dont vous les terminer.
Voici une petit application (en faite c’est un serveur HTTP) mais j’ai enlevé ce qui m’intéréssait pas puisque ce qui m’interesse dans ce cas là c’est les threads.
int main (int argc, char* argv[])
{
//Lancement d'un thread afin de faire des opérations bloquante en toile de fond sans
// bloquer l'utilisateur
hThreadEcoute = CreateThread(NULL, 0, ThreadServerProc, NULL, CREATE_SUSPENDED, NULL);
//Ferme le handle du thread directement (plus aucune gestion sur lui)
CloseHandle(hThreadEcoute);
//Attend une demande de fin de programme par l'utilisateur
getchar();
}
DWORD WINAPI ThreadClientProc(LPVOID param)
{
/* Ici des opération non-bloquantes sont en cours pour répondre au client
mais comme ces opérations sont longues je les ai mises dans un thread
*/
ExitThread(0);
}
//Procédure principale du serveur
DWORD WINAPI ThreadServerProc(LPVOID)
{
while( 1 )
{
/* ici il y a une opération bloquante */
//Création d'un thread afin de répondre à une demande
HANDLE hThreadClient = CreateThread(NULL, 0, ThreadClientProc, NULL, 0, 0);
CloseHandle(hThreadClient);
}
}
Ma question est la suivante
Le thread principal ne devrait jamais s’arrêter, mais l’utiliseur peut bien utilier le “Ctrl + C” du clavier pour stopper le programme (ou tout simplement lorsque l’ordinateur s’éteint).
Es-ce grave si il n’y pas de ExitThread, donc que le thread ne se termine pas convenablement?
Faudrait-t-il que dans ce cas là je rende mes sockets non bloquant et que je test avec une variable si la fin du thread est demandée?
Exemple:
BOOL bRunning; //Variable gloable
while( bRunning )
{
/* ici il y a une opération NON bloquante */
//Création d'un thread afin de répondre à une demande
HANDLE hThreadClient = CreateThread(NULL, 0, ThreadClientProc, NULL, 0, 0);
CloseHandle(hThreadClient);
}
et dans la procédure principale, lorsque l’utilisateur le demande, je mets bRunning à “false”, j’attends que le thread se termine, et si il se termine pas je le supprime de la façon moche (TerminateThread).
hThreadEcoute = CreateThread(NULL, 0, ThreadServerProc, NULL, CREATE_SUSPENDED, NULL);
getchar();
if( WaitForSingleObject(hThreadEcoute, 200) == WAIT_TIMEOUT )
{
TerminateThread(hThreadEcoute, -1);
}
CloseHandle(hThreadEcoute);
PS: Dans l’exemple je n’ai pas mis de sémaphore pour la variable globale, mais il est clair que j’en mettrais dans mon programme final.