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

billou_13 874 Messages postés jeudi 4 mars 2004Date d'inscription 19 août 2014 Dernière intervention - 26 janv. 2007 à 10:56 - Dernière réponse : billou_13 874 Messages postés jeudi 4 mars 2004Date d'inscription 19 août 2014 Dernière intervention
- 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
yann_lo_san 1137 Messages postés lundi 17 novembre 2003Date d'inscription 23 janvier 2016 Dernière intervention - 26 janv. 2007 à 16:58
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()

Merci yann_lo_san 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 82 internautes ce mois-ci

Commenter la réponse de yann_lo_san
billou_13 874 Messages postés jeudi 4 mars 2004Date d'inscription 19 août 2014 Dernière intervention - 1 mars 2007 à 13:43
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
billou_13 874 Messages postés jeudi 4 mars 2004Date d'inscription 19 août 2014 Dernière intervention - 1 mars 2007 à 13:54
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.