Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > C++ Builder
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 10.09.2014, 16:47   #1
Homa_1983
Пользователь
 
Регистрация: 14.10.2011
Сообщений: 29
По умолчанию Вопрос по WaitForSingleObject от Event

Всем добрый день!

Такой вот у меня вопрос.

В одном процессе создается событие, и после выполнения определенных действий устанавливается в сигнализирующее состояние:

Код:
hEvent = CreateEvent(NULL,TRUE,FALSE,EventName);
                    ......
                    .......
SetEvent(hEvent);
В другом процессе по этому же событию пытаюсь сделать обработчик через switch:

Код:
hEvent = OpenEvent(EVENT_MODIFY_STATE,FALSE,EventName);
.......
.......
DWORD dwWaitResult = WaitForSingleObject(hEvent,INFINITE);
switch (dwWaitResult)
{
    case WAIT_OBJECT_0:
         .....
         break;
    case WAIT_TIMEOUT:
         ......
         break;*/
    case WAIT_FAILED:
         .....
         break;
    default:
         .....
         break;
}
Так вот, при выполнении build Unit выдается ошибка E2126 "Case bypasses initialization of a local variable" со ссылкой на строки, содержащие, соответственно WAIT_TIMEOUT, WAIT_FAILED, даже default.
<Windows.h> подключен.

Подскажите, пожалуйста, в чем может быть дело?

На WAIT_OBJECT_0 не ругается (если остальное закомментировать), но все равно работает не корректно (в любом случае выдает 0хFFFFFFFF).
Homa_1983 вне форума Ответить с цитированием
Старый 10.09.2014, 21:09   #2
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,330
По умолчанию

Так покажите эти строки.
Судя по всему, там создаются локальные переменные.
Оградите код в в каждом case фигурными скобками { }
waleri вне форума Ответить с цитированием
Старый 10.09.2014, 21:41   #3
Homa_1983
Пользователь
 
Регистрация: 14.10.2011
Сообщений: 29
По умолчанию

Цитата:
Сообщение от waleri Посмотреть сообщение
Так покажите эти строки.
Судя по всему, там создаются локальные переменные.
Оградите код в в каждом case фигурными скобками { }
Когда пытался разобраться, пробовал комментировать строки кода внутри каждого case, т.е оставлял только

case "значение":
//...;
//...;
break;

Все равно ловил вышеуказанную ошибку. Поэтому пришёл к выводу что строки ни при чем и не стал их писать здесь.
Homa_1983 вне форума Ответить с цитированием
Старый 11.09.2014, 10:02   #4
FataLL
Форумчанин
 
Аватар для FataLL
 
Регистрация: 29.01.2013
Сообщений: 319
По умолчанию

А из каких соображений выбран флаг EVENT_MODIFY_STATE?
FataLL вне форума Ответить с цитированием
Старый 11.09.2014, 10:58   #5
Homa_1983
Пользователь
 
Регистрация: 14.10.2011
Сообщений: 29
По умолчанию

Предполагалось использовать ResetEvent(). А в Synchronization Object Security and Access Rights вычитал следующее:
EVENT_MODIFY_STATE (0x0002) - Modify state access, which is required for the SetEvent, ResetEvent and PulseEvent functions.
Homa_1983 вне форума Ответить с цитированием
Старый 11.09.2014, 11:45   #6
Homa_1983
Пользователь
 
Регистрация: 14.10.2011
Сообщений: 29
По умолчанию

Действительно, изменение флага на EVENT_ALL_ACCESS, снимает все указанные мной ошибки.

EVENT_ALL_ACCESS - все возможные права доступа для event object. Используйте такое право, только если ваше приложение требует доступа за пределы, предоставляемые стандартными правами доступа и EVENT_MODIFY_STATE. Использование такого права доступа прямо увеличивает возможность того, что ваше приложение должно запускаться от имени администратора.

EVENT_MODIFY_STATE - Изменяет состояние доступа, который необходим для функций SetEvent, ResetEvent и PulseEvent.

Я полагал, что флаг EVENT_MODIFY_STATE вполне достаточен для второго процесса, чтобы тот мог изменять состояние Event с помощью функции ResetEvent()...

Похоже, я полагал неправильно...
Объясните, пожалуйста.
Homa_1983 вне форума Ответить с цитированием
Старый 12.09.2014, 22:09   #7
FataLL
Форумчанин
 
Аватар для FataLL
 
Регистрация: 29.01.2013
Сообщений: 319
По умолчанию

Ну, я рассуждаю так: в исходном примере флаг EVENT_MODIFY_STATE явно не отвечает требуемому, ибо OpenEvent используется для получения хэндла именно для ожидания события с помощью WaitForSingleObject, а не для его изменения [читай, "управления"] с помощью Set/ResetEvent. Следовательно, я намекал на использование флага SYNCHRONIZE [он хоть и для NT-only, но где сейчас не NT?]. Думаю, его можно использовать вместо EVENT_ALL_ACCESS, если последний не очень по душе...
FataLL вне форума Ответить с цитированием
Старый 15.09.2014, 11:57   #8
Homa_1983
Пользователь
 
Регистрация: 14.10.2011
Сообщений: 29
По умолчанию

Все ясно. Спасибо.
Homa_1983 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
TThread и WaitForSingleObject xrob Общие вопросы Delphi 4 20.04.2014 14:13
Не срабатывает waitforsingleobject peeper Общие вопросы Delphi 2 28.11.2013 16:10
Многопоточность showmodal и WaitForSingleObject bulldog5293 Общие вопросы Delphi 24 24.01.2011 18:46
WaitForSingleObject besserebrenik Win Api 3 15.02.2010 22:40
вопрос по функции WaitForSingleObject shurik_7866 Общие вопросы Delphi 2 08.12.2008 10:53