Страница 1 из 1
Проблема с событиями (event) функция WaitForSingleObject
Добавлено: 15 фев 2008, 18:36
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 не задерживает поток ни на секунду.
Может я делаю что-то не правильно?

Re: Проблема с событиями (event) функция WaitForSingleObject
Добавлено: 16 фев 2008, 01:03
WinMain
Честно говоря, не совсем понятен твой замысел. Если у тебя оконное приложение, то окно и так находится в состоянии бесконечного цикла обработки событий (message loop), в том числе и событий от клавиатуры. В твоей оконной процедуре необходимо лишь перехватить событие WM_CHAR или WM_KEYDOWN и выполнить соответствующие действия. Зачем для этого ещё дублировать режим ожидания событий от клавиатуры в дополнительном потоке? Если тебе нужно выполнить какую-то процедуру в дополнительном потоке, то и запускай её в потоке каждый раз при обработке сообщений WM_CHAR или WM_KEYDOWN. Тогда объект Event и функция WaitForSingleObject могут вообще не понадобиться.
Ну а если тебе всё-таки хочется сделать по-своему, то рекомендую функцию SetEvent() вызывать в паре с функцией ResetEvent(), т.е. таким образом:
Код: Выделить всё
WndProc(...)
{
...
SetEvent(hEvent);
ResetEvent(hEvent);
...
}
Либо вместо двух этих функций вызывать одну функцию PulseEvent(), должно получиться тоже самое.
Re: Проблема с событиями (event) функция WaitForSingleObject
Добавлено: 18 фев 2008, 10:18
Hawk
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 не задерживает поток ни на секунду.
Может я делаю что-то не правильно?
Явно что-то не так, напиши какой код возвращает WaitForSingleObject?
Не удаляюешь ли ты где-то hEvent? То что ты написал должно работаь по любому =)
Видимо ошибка где-то в другом месте.