2010-02-06 2 views
1

에서 다음 코드는 내 XP의 SP2 시스템에서 완벽하게 잘 실행되지만 내 비스타 시스템에서 실행 때의 WaitForSingleObject에 대한 호출이 무기한 대기 : 여기의 WaitForSingleObject는 XP에서 자신의 세마포어를 얻을 수 있지만 비스타

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); 

스레드의 그 세마포어를 해제합니다.

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; 
} 

명명 된 세마포는 최근에 추가되지 않은 것이 었습니다. 그 전에 스레드는 익명의 세마포어로 ghSemaphore를 공유하고있었습니다. 명백한 차이는 없습니다. 누구든지 왜이 이진 (VC6, Express Edition에서 XP 컴퓨터에서 컴파일 된) 비스타에서 작동하지 않을 생각을 가지고 있습니까? 위에서 말했듯이, WaitForSingleObject 호출은 결코 끝나지 않는 것입니다.

THanks!

+1

MSDN에서는 ReleaseSemaphore()에 SEMAPHORE_MODIFY_STATE 보안 속성이 필요하다고 말합니다. CreateSemaphore()의 보안 속성에 대한 매개 변수로 NULL을 사용하고 있습니다. 이 보안 속성 집합으로 한 번 시도해 볼 수 있습니까? – Naveen

+0

@Naveen, 일단 OpenSemaphore가 성공하면 (물론 OP가 아마도 다른 점을 알게 될 것입니다) 핸들 *은 SEMAPHORE_MODIFY_STATE 액세스 권한을가집니다. – avakar

+0

@philo, 코드는 Vista에서 나에게 잘 작동합니다. 스 니펫을 별도의 프로세스에 넣었을 때도 마찬가지입니다. 귀하의 프로세스에 특별한 것이 있습니까? 아니면 평범한 응용입니까? – avakar

답변

0

지금은 그것을 확인하지만, 그것에 대해 듣고, 그래서 시도 할 수 없습니다 lMaximumCount = 1 세마포어라는 그런데 SECURITY_ATTRIBUTES

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

의 빈 인스턴스에 NULL에서 CreateSemaphore 함의 첫 번째 인수를 변경 되어 완전히 명명 된 뮤텍스와 동일합니다. 따라서 뮤텍스를 사용할 가능성을 검토하십시오.

+0

와우, 빠른 응답에 감사드립니다! 이 코드를 사용하여 동일한 동작이 추가되었습니다. – philo

+0

ReleaseSemaphore를 호출하려면 @Naveen이 맞습니다. SEMAPHORE_MODIFY_STATE 만 필요합니다. – Dewfy

0

해결되었습니다. 이는 전적으로 사용자 오류입니다. @Dewfy, @Naveen 및 @avakar에게 감사드립니다.

Filemaker 레이아웃에서 그 결과를 표시했기 때문에 사용자 함수가 호출되고 있다고 확신했습니다. 내가 깨닫지 못한 것은 이러한 반환 값이 기본적으로 캐시된다는 것입니다. 이 함수는 절대로 호출되지 않았습니다. 내 스레드와 세마포어로 내가 뭘하고 있었는지 완전히 이해할 때까지는 제안이 정말 도움이 되었기 때문에 나는 뒤로 물러 설 수있었습니다.

여전히 세마포어 코드를 제거했을 때 사용자 기능이 제공해야하는 리소스에 액세스 할 수 있었던 이유는 무엇입니까? 그러나 그것은 별개의 문제입니다.

느낌이 좋아졌습니다.

관련 문제