2010-02-06 5 views
1

Le code suivant fonctionne parfaitement bien sur mon machine XP SP2, mais l'appel à WaitForSingleObject attend indéfiniment lors de l'exécution sur ma machine Vista:WaitForSingleObject obtient son sémaphores dans XP, mais pas dans Vista

HANDLE ghSemaphore; 
ghSemaphore = CreateSemaphore(NULL, 0, 1, "COM_PHILOERTEL_FINA"); 
if (ghSemaphore == NULL) { 
MessageBoxA(NULL,"Error creating semaphore","ERROR",0); 
return FALSE; 
} 

MessageBoxA(NULL,"Semaphore created. Waiting for it to be triggered","ERROR",0); 
WaitForSingleObject(ghSemaphore, INFINITE); 
// got the semaphore, ready to rock 

MessageBoxA(NULL,"Got the semaphore, ready to rock!","Notice",0); 

est ici le fil qui libère le sémaphore:

ghSemaphore = OpenSemaphore(SEMAPHORE_ALL_ACCESS, FALSE, "COM_PHILOERTEL_FINA"); 
if (ghSemaphore == NULL) { 
    MessageBoxA(NULL,"Failed to open semaphore","ERROR",0); 
    return FALSE; 
} 

if (0 == ReleaseSemaphore(ghSemaphore, 1, NULL)) { 
    MessageBoxA(NULL,"Plugin was unable to release the semaphore","ERROR",0); 
    return FALSE; 
} 

Le sémaphore nommé était un ajout récent qui ne faisait rien de bon. Avant cela, les discussions ne faisaient que partager ghSemaphore avec son sémaphore anonyme. Pas de différence apparente. Est-ce que quelqu'un a une idée pourquoi ce binaire (compilé sur la machine XP dans VC6, Express Edition fwiw) ne fonctionnerait pas dans Vista? Comme je l'ai dit plus haut, l'appel WaitForSingleObject est ce qui ne finit jamais.

THanks!

+1

MSDN dit que ReleaseSemaphore() nécessite attribut de sécurité SEMAPHORE_MODIFY_STATE. Vous utilisez NULL comme paramètre pour l'attribut de sécurité dans CreateSemaphore(). Pouvez-vous essayer une fois avec cet ensemble d'attributs de sécurité? – Naveen

+0

@Naveen, une fois que le 'OpenSemaphore' réussit (et il fait apparemment comme le PO remarquerait probablement autrement), le handle * a * le droit d'accès SEMAPHORE_MODIFY_STATE. – avakar

+0

@philo, le code fonctionne bien pour moi sur Vista, même lorsque je mets les extraits dans des processus distincts. Y a-t-il quelque chose de spécial dans votre processus ou s'agit-il d'une application normale non étalonnée? – avakar

Répondre

0

Je ne peux pas le vérifier en ce moment, mais entendu parler, alors essayez: Changer premier argument de CreateSemaphore de NULL à l'instance vide de SECURITY_ATTRIBUTES

SECURITY_ATTRIBUTES dumy; 
dumy.nLength = sizeof(dumy); 
dumy.lpSecurityDescriptor = 0; 
dumy.bInheritHandle = TRUE; 
CreateSemaphore(&dumy, 0, 1, "COM_PHILOERTEL_FINA"); 

Par ailleurs sémaphores nommé avec lMaximumCount = 1 est entièrement équivalent de mutex nommé. Donc, revoir la possibilité d'utiliser mutex.

+0

Wow, merci pour la réponse rapide! Même comportement avec ce code ajouté. – philo

+0

Il semble que @Naveen a raison, pour appeler ReleaseSemaphore seul SEMAPHORE_MODIFY_STATE est nécessaire. – Dewfy

0

Résolu. C'était entièrement une erreur de l'utilisateur. Merci @Dewfy, @Naveen, et @avakar pour vos réponses réfléchies. J'étais sûr que la fonction utilisateur était appelée parce que j'affichais son résultat dans ma mise en page Filemaker. Ce que j'ai échoué à réaliser, c'est que ces valeurs de retour sont mises en cache par défaut. La fonction n'a jamais été appelée. Vos suggestions ont été très utiles, car ce n'est qu'après avoir complètement compris ce que je faisais avec mes fils et mes sémaphores que j'ai pu prendre du recul et dire «attendez, quelque chose ne va pas ici».

Je suis toujours aux prises avec le mystère de pourquoi, lorsque j'ai supprimé le code de sémaphore, j'ai pu accéder à la ressource que la fonction utilisateur était supposée fournir, même si cette fonction n'était pas en cours d'exécution. Mais c'est un problème distinct.

se sent bien

Questions connexes