2010-04-30 2 views
0

프로세스 A에서 보낸 이벤트 결과를 기반으로 특정 작업을 수행하는 스위치가 포함 된 프로세스 B의 스레드 기능이 어레이에 두 요소로 저장되어 있습니다.스위치 명령문 사용 - C

프로세스 A가 보낼 데이터가있을 때 신호를 보내는 이벤트에 첫 번째 요소를 설정하고 프로세스 A가 닫힌 시점을 나타내는 이벤트를 두 번째 요소로 설정했습니다.

switch 문에 대한 기능을 구현하기 시작했지만 예상대로 결과를 얻지 못했습니다. 첫 번째 배열의 이벤트가 두 번째 배열 신호를하면 프로세스 B는 간단한 메시지 상자를 표시해야 신호를하면 당신이 볼 수 있듯이

//Thread function 
     DWORD WINAPI ThreadFunc(LPVOID passedHandle) 
     {  
      for(i = 0; i < 2; i++) 
      { 
       ghEvents[i] = OpenEvent(EVENT_ALL_ACCESS, FALSE, TEXT("Global\\ProducerEvents")); 
       if(ghEvents[i] == NULL) 
       { 
        getlasterror = GetLastError(); 
       } 
      } 
      dwProducerEventResult = WaitForMultipleObjects(
       2, 
       ghEvents, 
       FALSE, 
       INFINITE); 

     switch (dwProducerEventResult) 
     { 
     case WAIT_OBJECT_0 + 0: 
      { 
       //Producer sent data 
       //unpackedHandle = *((HWND*)passedHandle); 

       MessageBox(NULL,L"Test",L"Test",MB_OK); 
       break; 
      } 
     case WAIT_OBJECT_0 + 1: 
      { 
       //Producer closed 
       ExitProcess(1); 
       break; 
      } 
     default: 
      return; 
     } 

} 

응용 프로그램을 종료해야합니다

는 다음과 같은 고려하십시오.

실제로 프로세스 A를 닫으면 프로세스 B가 대신 메시지 상자를 표시합니다.

첫 번째 사례를 공백으로두면 (아무 것도하지 않음) 두 응용 프로그램이 모두 닫힙니다.

Error Image

내가 잘못 내 switch 문을 구현 한 :

는 또한 프로세스 B는 오류가 (언제 포장을 해체 주석) 슬로우됩니다 데이터를 전송? 나는 HWND의 포장을 올바르게 처리 했음에도 불구하고 어떤 제안을 했는가?

감사합니다.

편집 :

예 내가 다음 해요 : Here

이벤트 생성 프로세스 (A)에 :

for (i = 0; i < 2; i++) 
      { 
       ghEvents[i] = CreateEvent( 
        NULL, // default security attributes 
        TRUE, // auto-reset event object 
        FALSE, // initial state is nonsignaled 
        TEXT("Global\\ProducerEvents")); // unnamed object 

       if (ghEvents[i] == NULL) 
       { 
        printf("CreateEvent error: %d\n", GetLastError()); 
        ExitProcess(0); 
       } 
     } 
+0

당신은 모든 불필요한 공백과 올바른 (일관성)이 기능을 제거하기 위해 코드를 포맷 할 수 있습니다 치통? 지금은 읽는 것이 정말 어렵습니다. – Vicky

+0

좋아요, 변경 =] –

+0

와우, 행운을 비고 있습니다. –

답변

2

는 왜 두 번 같은 이벤트를 열고있다?

ghEvents[i] = OpenEvent(EVENT_ALL_ACCESS, FALSE, TEXT("Global\\ProducerEvents")); 

두 가지 다른 이벤트가 없어야합니까?

이것은 내가 실제로 가까운 프로세스 A가, 프로세스 B 대신 메시지 상자 를 표시 할 때

을보고하는 행동과 일치한다.

때문에 가까운 공정 A를 같은 이벤트는 두 가지 이벤트를 만들고, 정리해 WAIT_OBJECT_0 + 0

와 스위치를 입력하는 신호 때 - 프로세스 A가 폐쇄하고 메시지를 신호로 다른시 하나를 상자가 표시됩니다. 내가 < = 0 < = 9 그러나 요점은주기 반복이 다른 이름으로 이벤트를 만들어야한다는 것입니다에 대한

아래의 코드에만 작동합니다.

프로세스 A :

LPTSTR eventName[] = _T("Global\\ProducerEventi"); 
for (i = 0; i < 2; i++) 
{ 
    eventName[20] = '0' - i; // this will change last i character with '0' or '1' 
    ghEvents[i] = CreateEvent(NULL, TRUE, FALSE, eventName); 
... 

프로세스 B :

LPTSTR eventName[] = _T("Global\\ProducerEventi"); 
for(i = 0; i < 2; i++) 
{ 
    eventName[20] = '0' - i; // this will change last i character with '0' or '1' 
    ghEvents[i] = OpenEvent(EVENT_ALL_ACCESS, FALSE, eventName); 
    ... 
+0

내가 언급했듯이, 나는 일련의 사건들을 가지고있다. MSDN 문서에서 이벤트 배열을 통해 수행 할 수 있으며 구현에 충실하려고 노력했습니다. –

+0

이벤트 배열이 있습니다. 각 위치는 동일한 이벤트를 보유합니다. 따라서 프로세스 A에서 두 이벤트 (항상 같은 이벤트)를 알리면 항상 'WAIT_OBJECT_0 + 0'으로 끝납니다. –

+0

나는 프로세스 A에서 각 이벤트를 개별적으로 설정하는 것으로 이해하지 못한다. SetEvent (ghEvents [0]) ;. –

1

는 케이스/스위치에 대한 없습니다. 당신은 잘못된 포인터를 역 참조하려고합니다. 당신은 따라서, HWND 역 참조에 충돌을 시도하고있는 것처럼

1

는 것 같습니다.

ThreadFunc(hwndSomeWindow); 

하는 경우, 캐스트가 있어야한다 :

1

가정이 같은 ThreadFunc를 호출하고

unpackedHandle = (HWND) passedHandle; 

호출은 다음과 같이 인 경우에 귀하의 코드를 잘했을 것이다 :

ThreadFunc(&hwndSomeWindow); 
+0

우수, 감사합니다! –