WndProc(...)
{
...
SetEvent(hEvent);
...
}
Проблема с событиями (event) функция WaitForSingleObject
Структура следующая:
В основном потоке:
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 не задерживает поток ни на секунду.
Может я делаю что-то не правильно?
точно так же :
hEv=CreateEvent(Null,false,false,Null);
дальше строка
WaitForSingleObject(hEv,1000); под Win ME просто ждала 1000 мс и не реагировала на событие, а та же строка под XP просто проваливалась, вообще ни на что не реагируя.
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..
Цитата: awake
реальный глюк..я использовал эту связку в асме(чтоб сделать паузу цикла), всё работало..может рискни просто в цикле делать....
Кхм... некроманты млин.
Дату сообщения автора-то видел прежде чем ваять свой нетленный код?
Тем более что проблема - элементарна как грабли. Нужно создавать событие с автосбросом.
к тому же очень информативна была тупиковая ветка с 2умя сообщениями за 6 месяцев..
может и некросы, но не слепые. Это что: hEvent=CreateEvent(NULL,false,false,NULL);
? Не автосброс разве?
Цитата: Zor
2 Hardcase
может и некросы, но не слепые. Это что: hEvent=CreateEvent(NULL,false,false,NULL);
? Не автосброс разве?
может и некросы, но не слепые. Это что: hEvent=CreateEvent(NULL,false,false,NULL);
? Не автосброс разве?
Да действительно автосброс. Не сталкивался с таким поведением, так как никогда не пользуюсь ивентами - семафоры удобнее и работают всегда железно.
Код:
Тупо циклом - улыбнуло.
Цитата: Der Meister
Тупо циклом - улыбнуло.
Да вот когда программа к завтраму должна работать , а еще пару закладок надо наваять и время уже 10 вечера, то вместо цикла сделаешь и копирование куска кода раз так 50, только чтобы работало.