Поиск:

Ответ в темуСоздание новой темы Создание опроса
> CSingleLock, Как правильно использовать? 
:(
    Опции темы
Evgeny84
Дата 3.6.2007, 10:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 26
Регистрация: 20.5.2007

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



Как синхронизировать?
Есть 2 потока(классы(не функции)). Первый посылает сообщение другому (PostThreadMessage), второй выполняет операции и возвращает определённый результат по адресу находящемся в LPARAM,  или не возвращает...
Так вот надо заблокировать первый поток пока второй не отработает операцию(второй не завершается, а ждёт новых сообщений).

Пытался синхронизирующими классами:

THREAD1
Код

...
m_pSingleLock->Lock();
m_pPhread->PostThreadMessage(...);
m_pSingleLock->Lock();
m_pSingleLock->Unlock();
...


THREAD2
Код

...
{
...
m_pSingleLock->Unlock();
}


но на втором Lock() в mtex.cpp по строке 107(в примере 5 строка) выдает ошибку:
Код

BOOL CSingleLock::Lock(DWORD dwTimeOut /* = INFINITE */)
{
        ASSERT(m_pObject != NULL || m_hObject != NULL);

!!!    ASSERT(!m_bAcquired);

        m_bAcquired = m_pObject->Lock(dwTimeOut);
        return m_bAcquired;
}

ИМХО должно заблокировать, а он проверяет занят ли он... =( В нашем случае занят...
Есть ф-ция IsLock(), но в цикле опрашивать тоже не лучший результат...

Вообщем как бороться????
PM MAIL   Вверх
Earnest
Дата 3.6.2007, 15:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



CSingleLock - это всего-лишь обертка для работы с конкретным объектом синхронизации: критической секции, мьютекса, события ... Из твоего кода не видно, что он у тебя есть.
Объект синхронизации должен жить где-то в твоих данных, а CSingleLock лучше делать автоматическим объектом, только на время блокировки.

Для твоего примера в качестве объекта лучше всего подойдет событие с автосбросом.

Заведи событие, так чтобы оно было доступно обеим потокам (функциям). Событие создавай в сброшенном виде.
Далее, после посылки сообщения первый поток должен ждать пока событие не будет установлено. Можно и CSIngleLock использовать, хотя я лично предпочитаю в таких случаях использовать прямо WaitForSingleObject (собственно, CSingleLock это и делает, но мне кажется семантически более правильно вызывать Wait..., т.к. мы именно ждем, а не блокируем доступ к каким-то данным).
Далее,  второй поток выполняет нужные действия и возводит событие в сигнальное состояние (SetEvent): типа, все готово, начальник... В этот момент оживание первого потока заканчивается и он продолжает работу...
Вообще, почитай про синхронизацию где-нибудь, например у Рихтера, чтобы понимать, что делаешь.



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


 




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


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

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