2012-03-09 6 views
1

Windows의 다른 프로세스간에 장벽을 설정하려고합니다. 그들은 본질적으로 동일한 프로세스의 두 복사본입니다 (프로세스 대신 두 개의 별도 스레드로 실행하는 것은 옵션이 아닙니다). 아이디어는 프로그램의 다른 단계에서 장벽을 배치하여 두 프로세스가 동시에 각 단계를 시작하도록합니다. Windows에서이 기능을 구현하는 가장 효율적인 방법은 무엇입니까?Windows의 프로세스 간 동기화 장

답변

3

명명 된 이벤트를 사용하십시오 (CreateEvent 및 WaitForSingleObject API 함수 참조). 장벽 당 두 개의 이벤트가 필요합니다. 각 이벤트는 응용 프로그램의 다른 인스턴스에서 생성됩니다. 그런 다음 두 인스턴스는 서로의 이벤트를 기다립니다. 물론 이러한 이벤트는 나중에 다른 장벽으로 재사용 할 수 있습니다.

비록 하나의 복잡성이 있지만 이벤트 이름이 전역 적으로 독특하기 때문에 각 이벤트의 이름 앞에는 인스턴스의 프로세스 ID가 붙을 수 있습니다. 따라서 응용 프로그램의 각 인스턴스는 다른 인스턴스에 의해 생성 된 이벤트의 이름을 찾으려면 다른 인스턴스의 ID를 가져야합니다.

창 응용 프로그램이있는 경우 응용 프로그램의 두 번째 인스턴스에 첫 번째 인스턴스가 있음을 알리는 메시지를 브로드 캐스트 할 수 있습니다.

+0

감사합니다. 그건 의미가 있습니다. 나는 단지 두 개의 프로세스를 사용하고 있기 때문에 모든 IPC 메서드를 사용하여 인스턴스 프로세스 ID를 보낼 수 있다고 생각합니다. 궁금한 점이 있습니다. 인스턴스 수가 다양 할 경우 언급 한대로 메시지를 어떻게 방송할까요? – cloudraven

+1

@cloudraven BroadcastSystemMessage (http://msdn.microsoft.com/ko-kr/library/windows/desktop/ms644932%28v=vs.85%29.aspx)를 빠르고 간단하게 사용하는 방법입니다. 올바른 방법은 메모리 (EnumWindows()가 열리는 경우)를 열거하고 각 창에 메시지를 보내는 것입니다. –

+0

ManualReset 이벤트를 사용해야하며 장벽의 첫 번째 단계로 자신의 이벤트 (각 프로세스의 관점에서 볼 때)가 발생하지 않았는지 확인해야합니다 (그렇지 않으면 동기화가 끊어집니다 이벤트 재사용으로 인해 WaitOne (0)을 사용하여 상태를 확인할 수 있습니다. 실제로는 잠시 잠을 자고 이벤트 만 발생시킵니다. [코드] while (myEvent.WaitOne (0)) { Thread.Sleep (10); } myEvent.Set() partnerEvent.WaitOne() partnerEvent.Reset() [/ code] –