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

Windows Discussion :

[+ou- débutant] utilisation des sémaphores


Sujet :

Windows

  1. #1
    Membre actif Avatar de Biosox
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    298
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2005
    Messages : 298
    Points : 203
    Points
    203
    Par défaut [+ou- débutant] utilisation des sémaphores
    Bonjour, j'écris un petit programme, et je voudrai qu'on ne puisse lancer que n (pour l'instant n=2) instances de ce programme simultanément. Je pense utiliser des sémaphores pour ceci.
    Voici comment je pense devoir procéder:
    1) Au lancement du programe, j'essaie d'ouvrir un sémaphore. Si l'ouverture ne marche pas cela signifie que le sémaphore n'as pas encore été crée, et donc que c'est la première instance du programme qui tourne. je crée donc le sémaphore.
    2) Je fais un WaitForSingleObject avec un timeout de 0, et si la valeur retournée est un WAIT_OBJECT_0 je continue, si c'est WAIT_TIMEOUT, je quitte le programme.

    pour l'instant, je me contente d'afficher le resultat du WaitForSingleObject afin de voir si tout se passe comme je le prévoyait (et vous avez déja deviné que ce n'est pas le cas)


    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
    HANDLE Semaphore;
    	
    //ouverture ou création du sémaphore:
    if((Semaphore=OpenSemaphore(SEMAPHORE_MODIFY_STATE,FALSE,"mySemaphore"))==NULL)
    	{
    		if((Semaphore=CreateSemaphore(NULL,2,2,"mySemaphore"))==NULL)
    		{
    			DEBUG_MESSAGE("Impossible de creer le semaphore\n")
    			return INITIALISATION_ERROR;
    		}
    		else
    		{
    			DEBUG_MESSAGE("Semaphore created\n")
    		}
    	}
    	else
    	{
    		DEBUG_MESSAGE("Semaphore opened\n")
    	}
    
    //verification de l'etat du semaphore et affichage du résultat:
    	DWORD result=WaitForSingleObject(Semaphore,0);
    	switch(result)
    	{
    	case WAIT_ABANDONED:
    		DEBUG_MESSAGE("wait abandoned\n")
    		break;
    	case WAIT_OBJECT_0:
    		DEBUG_MESSAGE("wait object 0\n")
    		break;
    	case WAIT_TIMEOUT:
    		DEBUG_MESSAGE("wait timeout\n")
    		break;
    	case WAIT_FAILED:
    		DEBUG_MESSAGE("wait failed\n")
    		break;
    	default:
    		DEBUG_MESSAGE("ce texte ne devrait jamais apparaitre\n")
    	}
    Remarque: le DEBUG_MESSAGE est une macro qui fait un printf en mode debug et qui ne fait rien en mode release.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    #ifdef _DEBUG
    #define DEBUG_MESSAGE(tEXT) {printf(tEXT);}
    #else
    #define DEBUG_MESSAGE(tEXT) {}
    #endif
    Lorsque je lance la première instance de mon programme, il affiche:
    Semaphore created
    wait object 0
    Mais lorsque je lance la deuxième instance, il affiche:
    Semaphore opened
    wait failed

    Moi je m'attendais a avoir:
    --1ere instance:
    Semaphore created
    wait object 0
    --2eme instance:
    Semaphore opened
    wait object 0
    --3eme instance:
    Semaphore opened
    wait timeout

    qqun peut-il m'aider?
    merci d'avance

  2. #2
    Expert éminent sénior

    Homme Profil pro
    pdg
    Inscrit en
    Juin 2003
    Messages
    5 753
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 753
    Points : 10 704
    Points
    10 704
    Billets dans le blog
    3
    Par défaut
    Que te dit GetLastError ?
    A priori, je pense que c'est un problème de droits. Les process suivants récupèrent un handle avec le droit SEMAPHORE_MODIFY_STATE. Je pense qu'il manque SYNCHRONIZE.

    Petite remarque: tu pourrais peut être te passer du test avec OpenSemaphore, car CreateSemaphore fait déjà ce test:
    If the function succeeds, the return value is a handle to the semaphore object. If the named semaphore object existed before the function call, the function returns a handle to the existing object and GetLastError returns ERROR_ALREADY_EXISTS.
    reste à voir au niveau des accès ce que ça implique, en lançant une instance en tant qu'admin et une autre en tant que user restreint.

  3. #3
    Membre actif Avatar de Biosox
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    298
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2005
    Messages : 298
    Points : 203
    Points
    203
    Par défaut
    MERCI!

    J'ai changé mon
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    OpenSemaphore(SEMAPHORE_MODIFY_STATE,FALSE,"mySemaphore")
    en
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    OpenSemaphore(SEMAPHORE_ALL_ACCESS,FALSE,"mySemaphore")
    et maintenant ça marche. Bon j'ai pas essayé de lancer une instance en tant qu'user restreint mais j'en aurai pas besoin, je me poserai la question plus tard s'il le faut.

    Petite remarque: tu pourrais peut être te passer du test avec OpenSemaphore, car CreateSemaphore fait déjà ce test
    en effet, mais je dois alors appeler GetLastError pour savoir si je suis la premiere instance ou pas, je n'y gagne donc pas grand chose il me semble? A moins qu'il n'y ait quelque chose que je n'ai pas compris?

    merci encore!

  4. #4
    Candidat au Club
    Inscrit en
    Mai 2007
    Messages
    3
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 3
    Points : 4
    Points
    4
    Par défaut named semaphore en java
    je voudrai qu'on ne puisse lancer que n instances de ce programme simultanément en utilisant les sémaphore en java.je suis perdue est ce quelqu'un peut m'aider

  5. #5
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 381
    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 381
    Points : 41 582
    Points
    41 582
    Par défaut
    Citation Envoyé par Biosox Voir le message
    en effet, mais je dois alors appeler GetLastError pour savoir si je suis la premiere instance ou pas, je n'y gagne donc pas grand chose il me semble? A moins qu'il n'y ait quelque chose que je n'ai pas compris?
    Tu y gagnes la disparition d'une race condition qui fait que le sémaphore pourrait être créé entre le open et le create...

Discussions similaires

  1. [Débutant] utilisation des exempleq MSDN
    Par maxmarie dans le forum Windows Forms
    Réponses: 2
    Dernier message: 20/10/2007, 09h31
  2. Réponses: 3
    Dernier message: 02/07/2007, 17h32
  3. [débutant] Utilisation des tags "html:link", etc.
    Par ghohm dans le forum Struts 1
    Réponses: 6
    Dernier message: 30/05/2007, 17h58
  4. Débutant [Utilisation des effets sonores]
    Par QuestionMan dans le forum Multimédia
    Réponses: 1
    Dernier message: 06/03/2007, 10h52
  5. [Débutant]Utilisation des Threads
    Par maniolo dans le forum Débuter avec Java
    Réponses: 19
    Dernier message: 10/07/2006, 11h31

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