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++

  1. #1
    Nouveau membre du Club
    Inscrit en
    Juin 2007
    Messages
    56
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 56
    Points : 26
    Points
    26
    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
    Nouveau membre du Club
    Inscrit en
    Juin 2007
    Messages
    56
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 56
    Points : 26
    Points
    26
    Par défaut
    Personne ? :s

  3. #3
    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
    Points : 2
    Points
    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é
    Expert éminent

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    4 264
    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 264
    Points : 6 683
    Points
    6 683
    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 : 40
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    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
    Nouveau membre du Club
    Inscrit en
    Juin 2007
    Messages
    56
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 56
    Points : 26
    Points
    26
    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

  7. #7
    Nouveau membre du Club
    Inscrit en
    Juin 2007
    Messages
    56
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 56
    Points : 26
    Points
    26
    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

  8. #8
    Nouveau membre du Club
    Inscrit en
    Juin 2007
    Messages
    56
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 56
    Points : 26
    Points
    26
    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

  9. #9
    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 : 40
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    Content que ça fonctionne

    ?

  10. #10
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 379
    Points : 41 573
    Points
    41 573
    Par défaut
    Pour ce genre de manips, je ne vois aucun inconvénient pour des threads, processus, ou Events manuels, mais j'ai des doutes sur les ressources limitées (sémaphores, mutexes)...

    Edit: Mince, ça reste légèrement ambigu:
    Citation Envoyé par MSDN (emphasis mine)
    The function modifies the state of some types of synchronization objects. Modification occurs only for the object or objects whose signaled state caused the function to return. For example, the count of a semaphore object is decreased by one. For more information, see the documentation for the individual synchronization objects.
    Que comprendre ?

  11. #11
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 379
    Points : 41 573
    Points
    41 573
    Par défaut
    Ça me démangeait tellement que j'ai fait un test:
    Code C : 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
    void TestWait(void)
    {
    	HANDLE hSem1 = CreateSemaphore(NULL, 1, 1, NULL);
    	HANDLE hSem2 = CreateSemaphore(NULL, 1, 1, NULL);
    	HANDLE hAllSems[] = { hSem1, hSem2 };
    	DWORD res = WaitForMultipleObjects(ARRAYSIZE(hAllSems), hAllSems, FALSE, 0);
    	assert(res == WAIT_OBJECT_0);
     
    	{
    		LONG oldCount1 = -1;
    		LONG oldCount2 = -1;
    		BOOL bSem1Acquired = ReleaseSemaphore(hSem1, 1, &oldCount1);
    		BOOL bSem2Acquired = ReleaseSemaphore(hSem2, 1, &oldCount2);
     
    		printf("Sem1's boolean is %d, count is %ld.\n", bSem1Acquired, oldCount1);
    		printf("Sem2's boolean is %d, count is %ld.\n", bSem2Acquired, oldCount2);
    	}
    	CloseHandle(hSem1);
    	CloseHandle(hSem2);
    }
    En sortie:
    Code X : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Sem1's boolean is 1, count is 0.
    Sem2's boolean is 0, count is -1.
    Donc, c'est OK : Seul l'objet retourné est réservé.

+ 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