Переключение использования оператора - C - PullRequest
0 голосов
/ 30 апреля 2010

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

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

Я начал реализовывать функциональность оператора 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, процесс B отображает окно сообщения.

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

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

Error Image

Не правильно ли я реализовал оператор switch? Я хоть и правильно распаковал HWND, есть предложения?

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

Edit:

Пример, которым я следую: Здесь

Создание события в процессе 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); 
                } 
        }

Ответы [ 4 ]

2 голосов
/ 30 апреля 2010

Почему вы открываете одно и то же событие дважды?

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

Разве не должно быть двух разных событий?

Это соответствует поведению, о котором вы сообщаете

Когда я на самом деле закрываю Процесс А, Процесс B отображает окно сообщения вместо этого.

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

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

Приведенный ниже код будет работать только для i <= 0 <= 9 </strong> Но главное - итерация цикла должна создать событие с другим именем.

Процесс А:

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);
    ...
1 голос
/ 30 апреля 2010

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

ThreadFunc(hwndSomeWindow);

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

unpackedHandle = (HWND) passedHandle;

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

ThreadFunc(&hwndSomeWindow);
1 голос
/ 30 апреля 2010

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

1 голос
/ 30 апреля 2010

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

...