Handle non valide a été spécifié ?!? [Résolu]

Messages postés
874
Date d'inscription
jeudi 4 mars 2004
Dernière intervention
19 août 2014
- - Dernière réponse : billou_13
Messages postés
874
Date d'inscription
jeudi 4 mars 2004
Dernière intervention
19 août 2014
- 1 mars 2007 à 13:54
Bonjour,

Alors voila, depuis ce matin, je me trouve confronter avec cette erreur. J'ai un thread d'écoute dans un handle
static HANDLE hListeningThread;
Suivant une méthode Stop() (et Start()), je peux fermer l'écoute et cela se passe très bien. Un petit bout de code du Stop()
//Delete listening thread

if(hListeningThread != NULL)
{
   WaitForSingleObject(hListeningThread, INFINITE);
   CloseHandle(hListeningThread);
   hListeningThread = NULL;
}

J'ai donc créé une méthode Reset() qui appelle à la suite le Stop() puis le Start().
Elle fonctionne très bien au premier appel mais au second, visual C++ renvoie l'erreur suivante :
Un handle non valide a été spécifié (en s'arrétant sur le CloseHanlde(hListeningThread)).

Avez-vous déjà rencontrer ce problème ?

Merci par avance,

Billou_13
Bask En Force

--------------------------------------------------------------------
Connaître la réponse est une chose, savoir pourquoi en est une autre
---------------------
Afficher la suite 

Votre réponse

3 réponses

Meilleure réponse
Messages postés
1137
Date d'inscription
lundi 17 novembre 2003
Dernière intervention
23 janvier 2016
20
3
Merci
Il est évident qu'un problème survient avec closeHandle.
Pour que ton code marche il faut appeler : TerminateThread() avant closeHandle(), et vérifier que la valeur de retour de GetExitCodeThread() ne soit plus à STILL_ACTIVE.
Mais ce n'est pas une bonne chose.

La structure de base la plus simple est :


hThread = CreateThread(...);

if ( !hThread )
  // Erreur ici
else
{
    // Lorsque la fonc. CALLBACK sera terminé...
  CloseHandle(hThread);
   hThread = NULL;
}

Mais pour le code que tu veux faire il faut utiliser un Mutex ou un Semaphore qui s'occupera de signaler le thread pour ton code de Reset()

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 91 internautes nous ont dit merci ce mois-ci

Commenter la réponse de yann_lo_san
Messages postés
874
Date d'inscription
jeudi 4 mars 2004
Dernière intervention
19 août 2014
16
0
Merci
Merci beaucoup (désolé pour le retard ^^).


Billou_13

Bask En Force


--------------------------------------------------------------------

Connaître la réponse est une chose, savoir pourquoi en est une autre

---------------------
Commenter la réponse de billou_13
Messages postés
874
Date d'inscription
jeudi 4 mars 2004
Dernière intervention
19 août 2014
16
0
Merci
Je ne vois pas trop la différence entre ton code :

if ( !hThread )
  // Erreur ici
else
{
   // Lorsque la fonc. CALLBACK sera terminé...
  CloseHandle(hThread);
   hThread = NULL;
}

Mis à part le WaitForSingleObject() qui me permet de savoir quand le thread est terminé (à moins que je ne me trompes).

J'avoue aussi ne pas très bien voir l'utilité et le fonctionnement avec la mise en place t'un mutex ou sémaphore. Qu'entends-tu par "signaler le thread" ?

Billou_13

Bask En Force


--------------------------------------------------------------------

Connaître la réponse est une chose, savoir pourquoi en est une autre

---------------------
Commenter la réponse de billou_13

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.