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

MFC Discussion :

CreateMutex() et WaitForSingleObject() ne fonctionnent plus ?


Sujet :

MFC

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2012
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2012
    Messages : 12
    Points : 12
    Points
    12
    Par défaut CreateMutex() et WaitForSingleObject() ne fonctionnent plus ?
    Le problème me parait surréaliste !
    Je jurerais l'avoir déjà fait fonctionner, mais en testant une petite création, je me suis aperçu que quelque chose n'allait pas.
    J'ai créé un petit programme de test afin de mettre les choses au clair, et là c'est le choc ! Les Mutex ne fonctionnent plus !
    J'en suis arrivé a executer le code suivant et à n'obtenir que des YES, instantanément (pas de Wait, ça rend la main tout de suite).

    En plus, c'est exactement comme ça que c'est préconisé de les utiliser !
    https://msdn.microsoft.com/fr-fr/lib...=vs.85%29.aspx

    Ais-je loupé un truc énorme ? Je l'espère !

    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
    void CTestDlg::OnBnClickedButton1()
    {
    	HANDLE hMutex = CreateMutex(NULL, FALSE, NULL);
    	if (hMutex == NULL) 
    	{
    		AfxMessageBox("CreateMutex error");
    		return;
    	}
    	//else :
     
    	DWORD dwResult1 = WaitForSingleObject(hMutex, INFINITE);
    	DWORD dwResult2 = WaitForSingleObject(hMutex, INFINITE);
    	DWORD dwResult3 = WaitForSingleObject(hMutex, INFINITE);
    	DWORD dwResult4 = WaitForSingleObject(hMutex, 2000);
    	DWORD dwResult5 = WaitForSingleObject(hMutex, 2000);
    	DWORD dwResult6 = WaitForSingleObject(hMutex, 2000);
     
    	if (dwResult1 == WAIT_OBJECT_0) AfxMessageBox("YES 1", MB_ICONINFORMATION);
    	else AfxMessageBox("NO 1");
     
    	if (dwResult2 == WAIT_OBJECT_0) AfxMessageBox("YES 2", MB_ICONINFORMATION);
    	else AfxMessageBox("NO 2");
     
    	if (dwResult3 == WAIT_OBJECT_0) AfxMessageBox("YES 3", MB_ICONINFORMATION);
    	else AfxMessageBox("NO 3");
     
    	if (dwResult4 == WAIT_OBJECT_0) AfxMessageBox("YES 4", MB_ICONINFORMATION);
    	else AfxMessageBox("NO 4");
     
    	if (dwResult5 == WAIT_OBJECT_0) AfxMessageBox("YES 5", MB_ICONINFORMATION);
    	else AfxMessageBox("NO 5");
     
    	if (dwResult6 == WAIT_OBJECT_0) AfxMessageBox("YES 6", MB_ICONINFORMATION);
    	else AfxMessageBox("NO 6");
     
    	//Output : No wait, all Messages are "YES" (YES 1, 2, 3, 4, 5 and 6). How Possible ?!
    }
    Je reçois WAIT_OBJECT_0 systématiquement et sans attente...
    J'ai utilisé ça dans un certain nombre d'applications maintenant alors ça me fait un peu peur

    Une idée ?
    Merci d'avance !

  2. #2
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2012
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2012
    Messages : 12
    Points : 12
    Points
    12
    Par défaut
    J'ai finalement trouvé - un thread peut reserver 116 fois le mutex sans jamais le liberer s'il veut - ça lui dira 116 fois qu'il vient de le reserver avec succès

    Par contre aucun autre Thread ne peut l'avoir tant qu'il n'a pas été Release...
    J'ai un temps utilisé des "Semaphores" de quantité "1" comme des Mutex mais voilà au moins une différence !

    Désolé du dérangement, en esperant que ça aide quelqu'un un jour sur Google

  3. #3
    Expert éminent sénior
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 631
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Analyste/ Programmeur

    Informations forums :
    Inscription : Juillet 2013
    Messages : 4 631
    Points : 10 558
    Points
    10 558
    Par défaut
    Si tu ne travailles pas sous XP, il y a un truc encore mieux

    Condition Variables

    Le pourquoi du comment, c'est que
    • la libération du mutex ou autre et l'attente
    • la sortie d'attente et l'acquisition du mutex ou autre


    sont atomiques contrairement aux couples: CreateMutex + ReleaseMutex + WaitForSingleObject + SetEvent.


    Si tu veux faire des tests.

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

Discussions similaires

  1. CSS ne fonctionne plus depuis le passage au XHTML
    Par Cr@zyDeep dans le forum Mise en page CSS
    Réponses: 6
    Dernier message: 27/09/2005, 14h42
  2. recordcount ne fonctionne plus
    Par Oluha dans le forum ASP
    Réponses: 1
    Dernier message: 26/09/2005, 14h24
  3. Réponses: 2
    Dernier message: 22/06/2005, 13h07
  4. mes requetes sous access ne fonctionnent plus
    Par trialrofr dans le forum ASP
    Réponses: 12
    Dernier message: 04/12/2004, 21h52
  5. [JSP][Tomcat]Changement de context -> JSP fonctionne plus
    Par mathieu dans le forum Servlets/JSP
    Réponses: 7
    Dernier message: 01/03/2004, 08h01

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