Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

SetEvent для сигнализации нескольким потокам. [Win2k, WinXP]


Дмитрий С ©   (2009-04-16 08:43:00) 

Есть Event и крит. секция:
FObjectEvent = CreateEvent(nil, True{ManualReset}, False {Unsignaled}, nil);
InitializeCriticalSection(FObjectCS);


Есть несколько потоков, которые примерно так ждут этого события:


WaitForSingleObject(FObjectEvent, INFINITE);
EnterCriticalSection(FObjectCS);
// Какая то работа над объектом
LeaveCriticalSection(FObjectCS);


И есть сигнализирующий поток:
EnterCriticalSection(FObjectCS);
SetEvent(FObjectEvent);
ResetEvent(FObjectEvent);
LeaveCriticalSection(FObjectCS);

Вопрос: Гарантировано ли сигнализирующий поток прервет ожидание этого Event-а во всех ждущих потоках?
Если нет, то как исправить?


Сергей М.   (2009-04-16 10:26:00) [1]

Ах ты вон о чем ..

Разумеется, если какой-то поток в период времени между SetEvent и ResetEvent не находился в состоянии ожидания, то это поток, разумеется, не получит извещения о просигналившем событии.


Дмитрий С   (2009-04-16 09:06:00) [2]


> Сергей М. ©   (16.04.09 08:57) [1]

Вопрос именно в том, чтобы прервать ожидание *всех* ждущий потоков. PulseEvent делает тоже самое, но меня смутил хелп по поводу него:

Sets the specified event object to the signaled state and then resets it to the nonsignaled state after releasing the appropriatenumber of waiting threads.
Note  This function is unreliableand should not be used. It exists mainly for backward compatibility. For more information, see Remarks.

Вот и спрашиваю вот.


Сергей М.   (2009-04-16 08:57:00) [3]


> Гарантировано ли


Да, иначе в этом объекте синхронизации попросту нет смысла.


> SetEvent(FObjectEvent);
> ResetEvent(FObjectEvent);


Это можно заменить на PulseEvent


Наверх

Титульная страница Поиск, карта сайта Написать письмо