Handle non valide a été spécifié ?!?

Résolu
Signaler
Messages postés
860
Date d'inscription
jeudi 4 mars 2004
Statut
Membre
Dernière intervention
19 août 2014
-
Messages postés
860
Date d'inscription
jeudi 4 mars 2004
Statut
Membre
Dernière intervention
19 août 2014
-
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
---------------------

3 réponses

Messages postés
1137
Date d'inscription
lundi 17 novembre 2003
Statut
Membre
Dernière intervention
23 janvier 2016
24
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()
Messages postés
860
Date d'inscription
jeudi 4 mars 2004
Statut
Membre
Dernière intervention
19 août 2014
29
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

---------------------
Messages postés
860
Date d'inscription
jeudi 4 mars 2004
Statut
Membre
Dernière intervention
19 août 2014
29
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

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