2009-10-16 5 views
0

프로세스 간 통신을 구현하는 응용 프로그램을 만들고 있습니다. 이 목적을 위해 잘 작동하는 것으로 보이는 공유 버퍼를 설정했습니다. 이제는 데이터를 읽어야 할 때 데이터 수신 애플리케이션 (freepascal/lazarus로 작성)에게 을 알려주는 데이터 생성 애플리케이션 (C++로 작성)을위한 방법이 필요합니다.Win32 뮤텍스가 대기하지 않습니다.

이 목적으로 뮤텍스를 사용하려고했습니다. Windows API 프로그래밍에 대한 많은 경험이 없습니다.

내 문제는 아래의 FreePascal 코드에서 뮤텍스가 대기하지 않는다는 것입니다. TMutex.Wait() 함수를 호출 할 수는 있지만 오류 또는 아무것도 반환하지 않지만 단순히 기다리지는 않습니다.

생성자 TMutex.Create (sName : AnsiString);
begin
    sName : = 'Local \ Mutex'+ sName;
    hMutex = CreateMutexA (
                전무, // 기본 액세스 처음 소유하지
                사실, //
                PChar (sName)); // 뮤텍스라는
    hMutex = 0 다음
   
       는 ('뮤텍스 생성 실패') Exception.Create 인상 시작하면;
    끝;
끝;

소멸자 TMutex.Destroy;
begin
    CloseHandle (hMutex);
끝;

절차 TMutex.Wait;
begin
    (WaitForSingleObject (hMutex, INFINITE) <) 0이면 ShowMessage ('debug : wait returned returned something');
끝;

절차 TMutex.게시하다;
begin
    ReleaseMutex (hMutex);
끝; 사실 처음 소유를 의미 즉시 반환에 너무 기다리고 - 당신은 뒤로 일이

True, // initially not owned 

: 당신의 문제에서처럼

+0

명명 된 파이프가이 목적으로 개발되었습니다. IPC - 공유 메모리를 통해 - 간편한 ReadFile/WriteFile 기반 API –

답변

2

는 것 같습니다.

+0

이 true와 false를 모두 시도했지만 차이가없는 것 같습니다. 나는 그것이 원래대로 거짓이었고, 그것이 바뀌 었는지를 알기 위해 사실로 바꿨다. 그러나 그 의견을 갱신하지 않았다. 그것이 아무것도 바뀌지 않았기 때문에, 나는 다른 곳을 보았고 그것에 대해 잊어 버렸다. 여전히 ti를 false로 설정해도 아무 것도 바뀌지 않습니다. –

0

TMutex 메서드를 호출하는 코드를 표시하지 않습니다. 그러나 뮤텍스는 재진입 성임을 알아야합니다 : 스레드가 뮤텍스를 소유하고 있다면, 항상 뮤텍스에 대한 액세스가 허용되므로 대기가 차단되지 않습니다. 교착 상태를 피하기 위해 뮤텍스에 내장되어 있습니다.

다른 스레드에서 뮤텍스를 가져 오려고하면 대기가 차단되어야합니다.

+0

고마워, 나는 이것을 시도 할 것이다. 나중에 작동하는지 알려 드리겠습니다. –

+0

자, 이제 알겠습니다. 는 sharedmem을 사용합니다. 절차 TIPCThread.test; begin ShowMessage ('blaat') end; 절차 TIPCThread.Execute; begin 동기화 (@ 테스트); BlaatSharedMem.Mutex.Wait; 동기화 (@ 테스트); 끝; 아직 .... 나는 그들 사이에 대기 시간이없는 두 개의 ShowMessages가 있습니다. 나는 당신이 보았던 것처럼 새로운 스레드를 여기에서 시작했다. 나는 기다리지 만 차이는 없다. 그것은 전혀 기다리지 않는다. –

관련 문제