IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C++ Discussion :

[ WaitForMultipleObjects ] Lister tous les objets signales ?


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Juin 2007
    Messages
    56
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 56
    Par défaut [ WaitForMultipleObjects ] Lister tous les objets signales ?
    Bonjour tout le monde

    J'utilise la methode WaitForMultipleObjects(). Le soucis est que cette fonction retourne seulement le premier handle signale.

    Ce que je cherche a savoir, c'est si il est possible de lister tous les handles signales, et non pas seulement le premier ?

  2. #2
    Membre averti
    Inscrit en
    Juin 2007
    Messages
    56
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 56
    Par défaut
    Personne ? :s

  3. #3
    Nouveau candidat au Club
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 2
    Par défaut
    Bonjour.

    Et pourquoi ne pas mettre une bloucle qui empile les "HANDLE"s dans une liste ?

  4. #4
    r0d
    r0d est déconnecté
    Membre expérimenté

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    4 290
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 4 290
    Billets dans le blog
    2
    Par défaut
    Bonjour,

    je ne comprends pas trop le sens de ta question. Car quand tu sors d'un WaitForMultipleObjects, soit TOUS les threads sont finis (dans le cas du bWaitAll (3eme paramètre de WaitForMultipleObjects) est à TRUE), soit seul un thread est fini (bWaitAll) et tu sais lequel.

    Cela dit, jette un coup d'oeil sur le code suivant, peut-être que ça pourra aider:
    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
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    #include "windows.h"
     
    #include <iostream>
     
    using namespace std;
     
    #define NB_THREADS 4
     
    struct ThreadsMarker
    {
    	ThreadsMarker()
    	{
    		finishedThreads = new bool[4];
    		for(int i=0; i<NB_THREADS; i++)
    			finishedThreads[i] = false;
    	}
    	~ThreadsMarker(){delete [] finishedThreads;}
    	bool* finishedThreads;
    } ;
     
     
    DWORD WINAPI func0( LPVOID lpParam ) 
    {
    	for (int i=0; i<5; i++)
    	{
    		cout << "func0" << endl;
    		Sleep(500);
    	}
    	ThreadsMarker* tm = reinterpret_cast<ThreadsMarker*>(lpParam);
    	tm->finishedThreads[0] = true;
    	cout << "func0 finished" << endl;
    	return 0;
    }
     
    DWORD WINAPI func1( LPVOID lpParam ) 
    {
    	for (int i=0; i<5; i++)
    	{
    		cout << "func1" << endl;
    		Sleep(480);
    	}
    	ThreadsMarker* tm = reinterpret_cast<ThreadsMarker*>(lpParam);
    	tm->finishedThreads[1] = true;
    	cout << "func1 finished" << endl;
    	return 0;
    }
     
    DWORD WINAPI func2( LPVOID lpParam ) 
    {
    	for (int i=0; i<5; i++)
    	{
    		cout << "func2" << endl;
    		Sleep(850);
    	}
    	ThreadsMarker* tm = reinterpret_cast<ThreadsMarker*>(lpParam);
    	tm->finishedThreads[2] = true;
    	cout << "func2 finished" << endl;
    	return 0;
    }
     
    DWORD WINAPI func3( LPVOID lpParam ) 
    {
    	for (int i=0; i<5; i++)
    	{
    		cout << "func3" << endl;
    		Sleep(670);
    	}
    	ThreadsMarker* tm = reinterpret_cast<ThreadsMarker*>(lpParam);
    	tm->finishedThreads[3] = true;
    	cout << "func3 finished" << endl;
    	return 0;
    }
     
     
    int main(int argc, char* argv[])
    {
    	HANDLE handles[NB_THREADS];
    	DWORD dwThreadId[NB_THREADS];
    	DWORD dwEvent;
    	ThreadsMarker tm;
     
    	handles[0] = CreateThread( NULL, 0, func0, &tm, 0, &dwThreadId[0]);
    	handles[1] = CreateThread( NULL, 0, func1, &tm, 0, &dwThreadId[1]);
    	handles[2] = CreateThread( NULL, 0, func2, &tm, 0, &dwThreadId[2]);
    	handles[3] = CreateThread( NULL, 0, func3, &tm, 0, &dwThreadId[3]);
     
    	dwEvent = WaitForMultipleObjects(NB_THREADS, handles, FALSE, INFINITE);
     
    	cout << dwEvent << endl;
    	cin.get();
    	return 0;
    }
    Hope it helps.

  5. #5
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    je ne comprends pas trop le sens de ta question. Car quand tu sors d'un WaitForMultipleObjects, soit TOUS les threads sont finis (dans le cas du bWaitAll (3eme paramètre de WaitForMultipleObjects) est à TRUE), soit seul un thread est fini (bWaitAll) et tu sais lequel.
    Pas forcément non. La doc indique clairement que si plusieurs objets sont prêts, seul celui qui a le plus petit handle sera renvoyé.

    Cela dit, jette un coup d'oeil sur le code suivant, peut-être que ça pourra aider:
    On ne sait même pas s'il s'agit de threads

    Il faudrait fouiller dans la MSDN pour voir s'il n'y aurait pas des variantes plus appropriées, mais sinon une bidouille simple pourrait être, après le premier appel, de boucler jusqu'à ce que la fonction ne renvoie rien, avec un temps d'attente nul et en retirant le dernier handle renvoyé du tableau à chaque itération.

  6. #6
    Membre averti
    Inscrit en
    Juin 2007
    Messages
    56
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 56
    Par défaut
    Citation Envoyé par Laurent Gomila
    Pas forcément non. La doc indique clairement que si plusieurs objets sont prêts, seul celui qui a le plus petit handle sera renvoyé.


    On ne sait même pas s'il s'agit de threads

    Il faudrait fouiller dans la MSDN pour voir s'il n'y aurait pas des variantes plus appropriées, mais sinon une bidouille simple pourrait être, après le premier appel, de boucler jusqu'à ce que la fonction ne renvoie rien, avec un temps d'attente nul et en retirant le dernier handle renvoyé du tableau à chaque itération.
    Ah oui pas bete ! je vais regarder de ce cote, merci

  7. #7
    Membre averti
    Inscrit en
    Juin 2007
    Messages
    56
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 56
    Par défaut
    Citation Envoyé par Laurent Gomila
    Pas forcément non. La doc indique clairement que si plusieurs objets sont prêts, seul celui qui a le plus petit handle sera renvoyé.


    On ne sait même pas s'il s'agit de threads

    Il faudrait fouiller dans la MSDN pour voir s'il n'y aurait pas des variantes plus appropriées, mais sinon une bidouille simple pourrait être, après le premier appel, de boucler jusqu'à ce que la fonction ne renvoie rien, avec un temps d'attente nul et en retirant le dernier handle renvoyé du tableau à chaque itération.
    Superbe idee, ca marche parfaitement, et le code est bien plus harmonieux

    Merci encore

  8. #8
    Membre averti
    Inscrit en
    Juin 2007
    Messages
    56
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 56
    Par défaut
    Citation Envoyé par r0d
    Bonjour,

    je ne comprends pas trop le sens de ta question. Car quand tu sors d'un WaitForMultipleObjects, soit TOUS les threads sont finis (dans le cas du bWaitAll (3eme paramètre de WaitForMultipleObjects) est à TRUE), soit seul un thread est fini (bWaitAll) et tu sais lequel.

    Cela dit, jette un coup d'oeil sur le code suivant, peut-être que ça pourra aider:
    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
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    #include "windows.h"
     
    #include <iostream>
     
    using namespace std;
     
    #define NB_THREADS 4
     
    struct ThreadsMarker
    {
    	ThreadsMarker()
    	{
    		finishedThreads = new bool[4];
    		for(int i=0; i<NB_THREADS; i++)
    			finishedThreads[i] = false;
    	}
    	~ThreadsMarker(){delete [] finishedThreads;}
    	bool* finishedThreads;
    } ;
     
     
    DWORD WINAPI func0( LPVOID lpParam ) 
    {
    	for (int i=0; i<5; i++)
    	{
    		cout << "func0" << endl;
    		Sleep(500);
    	}
    	ThreadsMarker* tm = reinterpret_cast<ThreadsMarker*>(lpParam);
    	tm->finishedThreads[0] = true;
    	cout << "func0 finished" << endl;
    	return 0;
    }
     
    DWORD WINAPI func1( LPVOID lpParam ) 
    {
    	for (int i=0; i<5; i++)
    	{
    		cout << "func1" << endl;
    		Sleep(480);
    	}
    	ThreadsMarker* tm = reinterpret_cast<ThreadsMarker*>(lpParam);
    	tm->finishedThreads[1] = true;
    	cout << "func1 finished" << endl;
    	return 0;
    }
     
    DWORD WINAPI func2( LPVOID lpParam ) 
    {
    	for (int i=0; i<5; i++)
    	{
    		cout << "func2" << endl;
    		Sleep(850);
    	}
    	ThreadsMarker* tm = reinterpret_cast<ThreadsMarker*>(lpParam);
    	tm->finishedThreads[2] = true;
    	cout << "func2 finished" << endl;
    	return 0;
    }
     
    DWORD WINAPI func3( LPVOID lpParam ) 
    {
    	for (int i=0; i<5; i++)
    	{
    		cout << "func3" << endl;
    		Sleep(670);
    	}
    	ThreadsMarker* tm = reinterpret_cast<ThreadsMarker*>(lpParam);
    	tm->finishedThreads[3] = true;
    	cout << "func3 finished" << endl;
    	return 0;
    }
     
     
    int main(int argc, char* argv[])
    {
    	HANDLE handles[NB_THREADS];
    	DWORD dwThreadId[NB_THREADS];
    	DWORD dwEvent;
    	ThreadsMarker tm;
     
    	handles[0] = CreateThread( NULL, 0, func0, &tm, 0, &dwThreadId[0]);
    	handles[1] = CreateThread( NULL, 0, func1, &tm, 0, &dwThreadId[1]);
    	handles[2] = CreateThread( NULL, 0, func2, &tm, 0, &dwThreadId[2]);
    	handles[3] = CreateThread( NULL, 0, func3, &tm, 0, &dwThreadId[3]);
     
    	dwEvent = WaitForMultipleObjects(NB_THREADS, handles, FALSE, INFINITE);
     
    	cout << dwEvent << endl;
    	cin.get();
    	return 0;
    }
    Hope it helps.
    J'ai lu, mais j'ai trouve une solution, j'utilise waitForSingleObject, ainsi je peux tracer chaque handle cree. C'est un peu lourd mais ca marche

    Merci a vous deux d'avoir aide

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 2
    Dernier message: 19/06/2014, 14h12
  2. [Métadonnées] Lister tous les objets SAS de mon environnement
    Par fbatch dans le forum Administration et Installation
    Réponses: 3
    Dernier message: 01/07/2010, 16h03
  3. lister tous les objets rmiregistry
    Par une_tite_question dans le forum Entrée/Sortie
    Réponses: 2
    Dernier message: 21/05/2008, 20h45
  4. Trouver tous les objets d'un certain type dans un document?
    Par kobe dans le forum Général JavaScript
    Réponses: 13
    Dernier message: 03/11/2005, 17h07
  5. Rafraichissement de la fiche ainsi que de tous les objets
    Par portu dans le forum Composants VCL
    Réponses: 7
    Dernier message: 06/01/2004, 00h25

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo