Fermeture de thread/Stopper recvfrom
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:
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();
} |
Code:
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;
} |
Une partie du serveur, notamment l'appel à recvfrom et le moyen de stopper le thread:
Code:
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
} |
Merci de vos suggestions ou corrections pour remédier à cela, je commence à sécher...
Bonne soirée ;)
Nicolas
2 pièce(s) jointe(s)
Fermeture thread: messages d'erreur
Bonsoir,
Je suis entrain de terminer un serveur bootp qui tourne dans un thread. Lorsque je désire terminer le thread, je ferme d'abord le sochet grâce à shutdown() puis closesocket() et j'utilise WaitForSingleObject() avec des "event" pour être bien sur que ce thread se termine avant le thread principal.
Lorsque la console se ferme, j'ai deux messages qui apparaissent successivement, quelles pourraient en être les causes car j'ai du mal à cerner où je me plante dans mon code:
Le premier:
Pièce jointe 6776
Le second:
Pièce jointe 6777
Merci.
Bonne soirée ;)