![]() |
|
|
![]()
|
|
| Evgeny84 |
|
||||||
|
Новичок Профиль Группа: Участник Сообщений: 26 Регистрация: 20.5.2007 Репутация: нет Всего: нет |
Как синхронизировать?
Есть 2 потока(классы(не функции)). Первый посылает сообщение другому (PostThreadMessage), второй выполняет операции и возвращает определённый результат по адресу находящемся в LPARAM, или не возвращает... Так вот надо заблокировать первый поток пока второй не отработает операцию(второй не завершается, а ждёт новых сообщений). Пытался синхронизирующими классами: THREAD1
THREAD2
но на втором Lock() в mtex.cpp по строке 107(в примере 5 строка) выдает ошибку:
ИМХО должно заблокировать, а он проверяет занят ли он... =( В нашем случае занят... Есть ф-ция IsLock(), но в цикле опрашивать тоже не лучший результат... Вообщем как бороться???? |
||||||
|
|||||||
| Earnest |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 87 Всего: 183 |
CSingleLock - это всего-лишь обертка для работы с конкретным объектом синхронизации: критической секции, мьютекса, события ... Из твоего кода не видно, что он у тебя есть.
Объект синхронизации должен жить где-то в твоих данных, а CSingleLock лучше делать автоматическим объектом, только на время блокировки. Для твоего примера в качестве объекта лучше всего подойдет событие с автосбросом. Заведи событие, так чтобы оно было доступно обеим потокам (функциям). Событие создавай в сброшенном виде. Далее, после посылки сообщения первый поток должен ждать пока событие не будет установлено. Можно и CSIngleLock использовать, хотя я лично предпочитаю в таких случаях использовать прямо WaitForSingleObject (собственно, CSingleLock это и делает, но мне кажется семантически более правильно вызывать Wait..., т.к. мы именно ждем, а не блокируем доступ к каким-то данным). Далее, второй поток выполняет нужные действия и возводит событие в сигнальное состояние (SetEvent): типа, все готово, начальник... В этот момент оживание первого потока заканчивается и он продолжает работу... Вообще, почитай про синхронизацию где-нибудь, например у Рихтера, чтобы понимать, что делаешь. -------------------- ... |
|||
|
||||
![]()
|
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Visual C++/MFC/WTL | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |