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