Bonsoir,
Le contexte: réaliser un serveur bootp qui tourne dans un thread.![]()
Mon soucis est lorque je désire terminer le thread.
1) Lorsque le thread se termine, j'ai une erreur windows 0xc0000005. A ce que je compris, cela provient des variables dynamiques non libérées.
Pourtant je me suis inspiré de la FAQ pour gérer cela sous forme d'événements.
Comment arreter un thread de travail?
2) Mon deuxième soucis est de stopper la fonction recvfrom qui est bloquante.
J'ai effectué diverses tentatives mais aucune s'est avéré fonctionnées.
Voici des bouts de code pour illustrer l'affaire:
(En commentaire, les différentes tentatives que j'ai pu faire)
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28 /************************************************************************* erreur: Ferme le socket Valeur de retour: 15/11/2006 *************************************************************************/ void bootps::erreur() { /*if(WSAAsyncSelect(bootps_socket, (HWND)m_hThread, 0, FD_CLOSE) != 0){ trace("WSAAsyncSelect a echoue\n"); int numError = WSAGetLastError(); }*/ /*Le teste echoue...*/ /*if (WSAEventSelect(bootps_socket, m_hThread, FD_CLOSE) != 0){ trace("WSAEventSelect a echoue\n"); }*/ /*Le teste echoue...*/ if (shutdown(bootps_socket,SD_BOTH) != 0) trace("shutdown a échoue\n"); if(closesocket(bootps_socket) !=0) trace("Erreur fermeture socket\n"); ::WSACleanup(); }Une partie du serveur, notamment l'appel à recvfrom et le moyen de stopper le thread:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34 /************************************************************************* stopThreadServeur: Stop le thread du serveur bootp. Valeur de retour: true si aucune erreur durant l'initialisation false sinon 15/11/2006 *************************************************************************/ bool bootps::stopThreadServeur() { //Fermer le socket serveur erreur(); cout << "Fermeture du thread..." << endl; SetEvent(m_hEndThread); // attend que le thread soit terminé WaitForSingleObject(m_hWaitThread, INFINITE); // fermeture dans handles CloseHandle(m_hEndThread); CloseHandle(m_hWaitThread); //Termine la boucle infini du thread //m_flagThread = false; //Fermer le socket serveur //erreur(); return true; }
Merci de vos suggestions ou corrections pour remédier à cela, je commence à sécher...
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37 while (true) { // attente evenement de fin du thread. -> l'objet doit être signalé // WaitForSingleObject renvoie WAIT_OBJECT_0 si l'objet est signalé. /*if(WaitForSingleObject(m_hEndThread, 0) == WAIT_OBJECT_0) { //Liberation des ressources free((struct bootp *)bootp_recv); bootp_recv = NULL; // signale l'objet event d'attente et sort. SetEvent(m_hWaitThread); return 0; }*/ cod_ret = recvfrom( bootps_socket, (char*)bootp_recv, BUFSIZ, 0, (struct sockaddr *)NULL, (int *)NULL); // attente evenement de fin du thread. -> l'objet doit être signalé // WaitForSingleObject renvoie WAIT_OBJECT_0 si l'objet est signalé. if(WaitForSingleObject(m_hEndThread, 0) == WAIT_OBJECT_0) { //Liberation des ressources free((struct bootp *)bootp_recv); bootp_recv = NULL; // signale l'objet event d'attente et sort. SetEvent(m_hWaitThread); return 0; } ... //code }
Bonne soirée![]()
Nicolas
Partager