Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

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

9.8K
15 февраля 2008 года
eng
22 / / 02.10.2005
У меня в программе создается поток. В этом потоке бесконечный цикл, который ожидает ввода с клавиатуры.
Структура следующая:

В основном потоке:
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 не задерживает поток ни на секунду.
Может я делаю что-то не правильно?
479
16 февраля 2008 года
Ухух
142 / / 05.05.2006
Я давно разбирался и столкнулся с тем же. Вот поднял свои записи:
точно так же :
hEv=CreateEvent(Null,false,false,Null);
дальше строка
WaitForSingleObject(hEv,1000); под Win ME просто ждала 1000 мс и не реагировала на событие, а та же строка под XP просто проваливалась, вообще ни на что не реагируя.
41K
08 июля 2008 года
awake
2 / / 08.07.2008
реальный глюк..я использовал эту связку в асме(чтоб сделать паузу цикла), всё работало..может рискни просто в цикле делать:

WndProc(...)
{
...

//главное - внезапность:
ThereWasEvent=TRUE; //устанавливает по своему разумению флаг

...
}

while(1) //твой цикл
{

.....
while(1) //внутренний цикл ожидания события
{
sleep(10); //ну или побольше, чтоб проц не грузить
if ThereWasEvent==FALSE then continue;//или как оно в сях? короче
//ещё разок сначала
ThereWasEvent=0; // сьрасывает событие, мы его щас обработаем
exit; //это типа бряка из цикла или как оно там
} //внутренний цикл ожидания события

// если попали сюда, то о чудо, событие произошло и мы на это
//прореагировали успешно!
.....
//обработка события..


} //твой цикл



кстати очень возможно что работать будет быстрее, жрать меньше ресурсов, использовать меньше всякого непонятного синтаксиса и на ВСЕХ виндах(ну может в 3.11 не прокатит))

p/s/
_ttp://msdn.microsoft.com/en-us/library/ms682396(VS.85).aspx
_ttp://msdn.microsoft.com/en-us/library/ms687032.aspx
vista+xp+2k pro..
5
09 июля 2008 года
hardcase
4.5K / / 09.08.2005
Цитата: awake
реальный глюк..я использовал эту связку в асме(чтоб сделать паузу цикла), всё работало..может рискни просто в цикле делать....

Кхм... некроманты млин.
Дату сообщения автора-то видел прежде чем ваять свой нетленный код?
Тем более что проблема - элементарна как грабли. Нужно создавать событие с автосбросом.

41K
09 июля 2008 года
awake
2 / / 08.07.2008
видел..однако вопрос не был закрыт))
к тому же очень информативна была тупиковая ветка с 2умя сообщениями за 6 месяцев..
8.4K
12 июля 2008 года
Zor
104 / / 23.04.2006
2 Hardcase
может и некросы, но не слепые. Это что: hEvent=CreateEvent(NULL,false,false,NULL);
? Не автосброс разве?
5
13 июля 2008 года
hardcase
4.5K / / 09.08.2005
Цитата: Zor
2 Hardcase
может и некросы, но не слепые. Это что: hEvent=CreateEvent(NULL,false,false,NULL);
? Не автосброс разве?

Да действительно автосброс. Не сталкивался с таким поведением, так как никогда не пользуюсь ивентами - семафоры удобнее и работают всегда железно.

341
14 июля 2008 года
Der Meister
874 / / 21.12.2007
Да где-то затупил и лишний раз выставил событие, вот и всё.
 
Код:
WndProc(...)
{
...
SetEvent(hEvent);
...
}
Скорее всего, фильтр сообщений был не тот.
Тупо циклом - улыбнуло.
479
14 июля 2008 года
Ухух
142 / / 05.05.2006
Цитата: Der Meister
Тупо циклом - улыбнуло.



Да вот когда программа к завтраму должна работать , а еще пару закладок надо наваять и время уже 10 вечера, то вместо цикла сделаешь и копирование куска кода раз так 50, только чтобы работало.

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог