Проблема с событиями (event) функция WaitForSingleObject

Общие вопросы, не зависящие от языка реализации.

Модераторы: Duncon, Hawk, Romeo, Eugie

Ответить
engine
Сообщения: 13
Зарегистрирован: 10 фев 2008, 17:50

У меня в программе создается поток. В этом потоке бесконечный цикл, который ожидает ввода с клавиатуры.
Структура следующая:
В основном потоке:

Код: Выделить всё

WinMain(...)
{
   ...
   hEvent=CreateEvent(NULL,false,false,NULL);
   ...
}

WndProc(...)
{
   ...
   SetEvent(hEvent);
   ...
}
В созданном потоке:

Код: Выделить всё

while(true)
{
   WaitForSingleObject(hEvent, INFINITE);
   ...
}
Первый вызов WaitForSingleObject останавливает работу потока ожидая SetEvent. При второй итерации цикла уже никакого ожидания на ф-ии WaitForSingleObject не следует, т.е. он сразу же выходит из WaitForSingleObject (без всяких там SetEvent) и переходит к следующему коду.
Я никак не могу понять почему так происходит. Хочу обратить внимание, что при создании события второй аргумент ф-ии CreateEvent bManualReset=false.
Я даже пробовал сразу после WaitForSingleObject вызывать ResetEvent, но все равно на следующей итерации WaitForSingleObject не задерживает поток ни на секунду.
Может я делаю что-то не правильно? :confused:
Аватара пользователя
WinMain
Сообщения: 929
Зарегистрирован: 14 янв 2005, 10:30
Откуда: Москва
Контактная информация:

Честно говоря, не совсем понятен твой замысел. Если у тебя оконное приложение, то окно и так находится в состоянии бесконечного цикла обработки событий (message loop), в том числе и событий от клавиатуры. В твоей оконной процедуре необходимо лишь перехватить событие WM_CHAR или WM_KEYDOWN и выполнить соответствующие действия. Зачем для этого ещё дублировать режим ожидания событий от клавиатуры в дополнительном потоке? Если тебе нужно выполнить какую-то процедуру в дополнительном потоке, то и запускай её в потоке каждый раз при обработке сообщений WM_CHAR или WM_KEYDOWN. Тогда объект Event и функция WaitForSingleObject могут вообще не понадобиться.
Ну а если тебе всё-таки хочется сделать по-своему, то рекомендую функцию SetEvent() вызывать в паре с функцией ResetEvent(), т.е. таким образом:

Код: Выделить всё

WndProc(...)
{
   ...
   SetEvent(hEvent);
   ResetEvent(hEvent);
   ...
}
Либо вместо двух этих функций вызывать одну функцию PulseEvent(), должно получиться тоже самое.
Hawk
Сообщения: 216
Зарегистрирован: 17 фев 2004, 14:52
Откуда: СПб
Контактная информация:

engine писал(а):У меня в программе создается поток. В этом потоке бесконечный цикл, который ожидает ввода с клавиатуры.
Структура следующая:
В основном потоке:

Код: Выделить всё

WinMain(...)
{
   ...
   hEvent=CreateEvent(NULL,false,false,NULL);
   ...
}

WndProc(...)
{
   ...
   SetEvent(hEvent);
   ...
}
В созданном потоке:

Код: Выделить всё

while(true)
{
   WaitForSingleObject(hEvent, INFINITE);
   ...
}
Первый вызов WaitForSingleObject останавливает работу потока ожидая SetEvent. При второй итерации цикла уже никакого ожидания на ф-ии WaitForSingleObject не следует, т.е. он сразу же выходит из WaitForSingleObject (без всяких там SetEvent) и переходит к следующему коду.
Я никак не могу понять почему так происходит. Хочу обратить внимание, что при создании события второй аргумент ф-ии CreateEvent bManualReset=false.
Я даже пробовал сразу после WaitForSingleObject вызывать ResetEvent, но все равно на следующей итерации WaitForSingleObject не задерживает поток ни на секунду.
Может я делаю что-то не правильно? :confused:
Явно что-то не так, напиши какой код возвращает WaitForSingleObject?
Не удаляюешь ли ты где-то hEvent? То что ты написал должно работаь по любому =)
Видимо ошибка где-то в другом месте.
Ответить