2010-04-30 3 views
0

У меня есть функция потока в процессе B, которая содержит переключатель для выполнения определенных операций на основе результатов события, отправленного из процесса A, они сохраняются как два элемента в массиве.Использование операторов выводов - C

Я установил первый элемент в событие, которое сигнализирует, когда процесс А имеет данные для отправки, и у меня есть второй элемент, установленный в событии, которое указывает, что процесс А закрыт.

Я начал реализовывать функции для оператора switch, но я не получаю результаты, как я ожидаю.

Рассмотрим следующий пример:

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

} 

Как вы можете видеть, если событие в первом массиве сигнализируют процесс B должен отображать простое окно сообщения, если второй массив сигнализируется приложение должно закрыться.

Когда я фактически закрываю процесс A, Process B вместо этого отображает окно сообщения.

Если я оставляю первый случай незаполненным (ничего не делать), оба приложения закрываются так, как должны.

Далее процесс B передает данные об ошибке брошенные (Когда я закомментировать распаковку):

Error Image

ли я реализовал свой коммутатор заявление неправильно? Я, правда, правильно справился с распаковкой HWND, какие-то предложения?

Спасибо за ваше время.

Edit:

Пример я следующее: создание 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 отображает окно сообщения вместо этого.

Потому что, когда вы закрываете процесс А то же событие сигнализирует, что входит переключатель как WAIT_OBJECT_0 + 0

Подводя итог, создать два разных события - один для того, когда процесс А закрывается, а другой сигнал сообщение который будет показан.

ниже код будет работать только для я = 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

речь идет не о случае/выключателя. вы пытаетесь разыменовать неверный указатель.

1

Похоже, вы пытаетесь разыменовать HWND, следовательно, сбой.

1

Предполагая, что вы звоните ThreadFunc так:

ThreadFunc(hwndSomeWindow); 

В этом случае бросок должен быть:

unpackedHandle = (HWND) passedHandle; 

Ваш код был бы прав, если вызов был так:

ThreadFunc(&hwndSomeWindow); 
+0

Отлично, спасибо! –