Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Что в действительности делает CEvent::SetEvent? 
:(
    Опции темы
Dims
Дата 2.12.2009, 17:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1016
Регистрация: 21.11.2006

Репутация: 1
Всего: 11



В мануале написано, что CEvent::SetEvent()

Sets the state of the event to signaled, releasing any waiting threads.

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

Код

CSingleLock lock( &event_object, TRUE );
event_object.SetEvent();
lock.Unlock();


Если верить документации, то ожидающие потоки освобождаются на второй строчке, а если верить логике, то на третьей.

Что я понимаю не так?

PM MAIL   Вверх
NiJazz
Дата 2.12.2009, 23:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Jazz coder
****


Профиль
Группа: Экс. модератор
Сообщений: 2286
Регистрация: 10.8.2003
Где: Москва

Репутация: 1
Всего: 23



Ожидающие потоки ждут возбуждения события - типа команды "старт". Это происходит при вызове SetEvent. Документация не врёт smile

PM MAIL   Вверх
Dims
Дата 3.12.2009, 18:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1016
Регистрация: 21.11.2006

Репутация: 1
Всего: 11



Но ждут-то они возможности залочить этот объект! Если они смогут это сделать до того, как данный поток отпустит его, то получится, что объект захвачен двумя потоками сразу, а это невозможно!

Это сообщение отредактировал(а) Dims - 3.12.2009, 18:55
PM MAIL   Вверх
NiJazz
Дата 5.12.2009, 01:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Jazz coder
****


Профиль
Группа: Экс. модератор
Сообщений: 2286
Регистрация: 10.8.2003
Где: Москва

Репутация: 1
Всего: 23



Вам точно нужны события, а не мьютекс? Мьютекс как раз обладает семантикой владения, в отличие от событий. Событие - это вкл/выкл, на него может реагировать сколь угодное количество потоков, а мьютекс захватывается лишь одним (кому повезло). 

Захват мьютекса - WaitForSingleObject при возврате.
Освобождение - ReleaseMutex.
PM MAIL   Вверх
Dims
Дата 7.12.2009, 21:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1016
Регистрация: 21.11.2006

Репутация: 1
Всего: 11



Я думаю, мне нужно именно событие, так как у меня один поток должен "дать пинка" другому.  

Но интересно, как с ним работать не на Win32, а на MFC. Я не подумал, что может быть объект, у которого нет семантики захватывания.

Но в случае MFC я должен пользоваться классом CSingleLock, а его имя говорит именно о захватывании.

Так что же, код правильный, просто никакого захватывания не происходит?

Более подробно, мне нужно сделать синхронный вызов функции в другом потоке, то есть, вызывающий поток должен инициировать работу функции в другом потоке, а сам подождать окончания её работы. 
PM MAIL   Вверх
Earnest
Дата 8.12.2009, 12:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 53
Всего: 183



CSingleLock использовать с событиями как-то действительно не логично. Как уже писали, нет там семантики захвата. И в чем проблема? С одной стороны делаешь SetEvent, а с другой - ждешь WaitForSingleObject. Но лучше не Single, конечно. Я обычно потоки синхронизирую так: есть простенькая оболочка для функции потока, для каждого потока создается свой StopEvent (чтобы красиво тормознуть, если надо), и любое колическтво событий-пинков (или не событий - это могут быть любые объекты синхронизации, кроме CS). Для каждого объекта (они храняться как массив хандлов) устанавливается свой обработчик. В результате функция потока представляет собой цикл ожидания всех этих объектов. Если пришел StopEvent, функция завершается, если что-то другое - выполняется соответствующий обработчик.
Цитата(Dims @  7.12.2009,  22:36 Найти цитируемый пост)
Более подробно, мне нужно сделать синхронный вызов функции в другом потоке, то есть, вызывающий поток должен инициировать работу функции в другом потоке, а сам подождать окончания её работы.  

Здесь нужны два события, доступные обоим потокам: первый поток готовит данные, устанавлоивает событие Start и начинает ждать событие Done. Второй поток ждет событие Start, делает обработку, устанавливает Done. И, кстати, оба  с автосбросом. 
Без автосброса нужно только тогда, когда много потоков пинать нужно.
Одним событием не обойдешься, можно нарваться на то, что первый поток, установив событие и начав его же ждать, первый его и поймает. И чего их экономить, с двумя логика проще и понятнее. 


--------------------
...
PM   Вверх
Dims
Дата 9.12.2009, 19:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1016
Регистрация: 21.11.2006

Репутация: 1
Всего: 11



А как сделать WaitFor.. именно на MFC?
PM MAIL   Вверх
NiJazz
Дата 10.12.2009, 00:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Jazz coder
****


Профиль
Группа: Экс. модератор
Сообщений: 2286
Регистрация: 10.8.2003
Где: Москва

Репутация: 1
Всего: 23



Цитата(Dims @  9.12.2009,  20:24 Найти цитируемый пост)
А как сделать WaitFor.. именно на MFC? 

Код

::WaitForSingleObject( event_object->m_hEvent, INFINITE );

Как-то так.
PM MAIL   Вверх
Earnest
Дата 10.12.2009, 09:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 53
Всего: 183



MFC-шные оболочки WaitForSingleObject / WaitForMultipleObjects - CSingleLock и CMultiLock. Но семантика у них более мутная, чем у апишных Wait... Поэтому даже в коде MFC, особенно для событий, предпочитают пользоваться прямыми апишными функциями. Чего и тебе рекомендую. А вот сами объекты синхронизации (собтыя и прочее) удобнее использовать в оболочках (т.е. не голые хандлы, а CEvent, CMutex и т.д.) - т.к. это избавляет тебя от ручных инициализации и удаления. Если речь идет именно о блокировках (стоять-не двигаться-пока-не отпущу), то вполне удобно использовать CSingleLock\CMultiLock, но как уже сказано, не с событиями.


--------------------
...
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1244 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.