Russian Qt Forum
Ноябрь 22, 2024, 23:49 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: 1 [2]   Вниз
  Печать  
Автор Тема: Надо дождаться двух сигналов  (Прочитано 10775 раз)
BRE
Гость
« Ответ #15 : Август 25, 2011, 23:51 »

Вставь вот такую строку в разные места и посмотри в каких потоках точно работает код. Что то мне подсказывает, что ты будешь удивлен результатом. Подмигивающий
Код
C++ (Qt)
qDebug() << QThread::currentThreadId();
 
Записан
BRE
Гость
« Ответ #16 : Август 25, 2011, 23:53 »

а какая может быть опасность?

Код
C++ (Qt)
{
m.lock();
...
if( условие )
{
return; // Мутекс m останется залоченным. С QMutexLocker такое не возможно.
}
 
m.unlock();
}
 
« Последнее редактирование: Август 25, 2011, 23:56 от BRE » Записан
Гурман
Гуру общения
******
Offline Offline

Сообщений: 1442

Qt 2.2, 3.3, 4.5, 4,7, 4.8, 5.3, 5.6, 5.9, 5.12


Просмотр профиля
« Ответ #17 : Август 26, 2011, 00:05 »

Вставь вот такую строку в разные места и посмотри в каких потоках точно работает код. Что то мне подсказывает, что ты будешь удивлен результатом. Подмигивающий

а, не... вспомнил... это используется действительно, только с объектом, работающим в другом потоке

уже час ночи, спать пора...

Цитировать
Мутекс m останется залоченным. С QMutexLocker такое не возможно.

ну в моем случае такого не будет
Записан

2^7-1 == 127, задумайтесь...
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #18 : Август 26, 2011, 10:16 »

Ну просто "дождаться" нет проблем
Код
C++ (Qt)
for (int i = 0; i < 2; ++i)
theSemaphore.acquire();
// полагаем что др. нитки сделают theSemaphore.release
 
Но это остановит нитку полностью, ничего принять она не сможет пока ее с семафора не снимут др. нитки.

Поэтому выглядит так что ничего останавливать/синхронизировать не надо. Крутится себе нитка в eventLoop - ну и пусть. Когда оба нужных сигнала приняты (напр прjверить по if) - начинается какое-то действие
Записан
Гурман
Гуру общения
******
Offline Offline

Сообщений: 1442

Qt 2.2, 3.3, 4.5, 4,7, 4.8, 5.3, 5.6, 5.9, 5.12


Просмотр профиля
« Ответ #19 : Август 26, 2011, 12:08 »

Цитировать
это остановит нитку полностью, ничего принять она не сможет пока ее с семафора не снимут др. нитки.

не, это ерунда

Цитировать
выглядит так что ничего останавливать/синхронизировать не надо.

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

BRE в конце предыдущей страницы предложил решение, похожее на то, что надо, только там счетчик при приеме сигналов надо не мутексом m защищать, а еще одним мутексом, m занят ожидателем w

пока руки не дошли реализовать, другое дело подвернулось, но идея правильная
Записан

2^7-1 == 127, задумайтесь...
BRE
Гость
« Ответ #20 : Август 26, 2011, 12:11 »

только там счетчик при приеме сигналов надо не мутексом m защищать, а еще одним мутексом, m занят ожидателем w
Разберись как работают условные переменные. Улыбающийся
m ничем не занят. wait разлочит этот мьютекс при остановке и залочит его заново при просыпании.
Записан
Гурман
Гуру общения
******
Offline Offline

Сообщений: 1442

Qt 2.2, 3.3, 4.5, 4,7, 4.8, 5.3, 5.6, 5.9, 5.12


Просмотр профиля
« Ответ #21 : Август 26, 2011, 12:27 »

Цитировать
wait разлочит этот мьютекс при остановке и залочит его заново при просыпании

где об этом написано?
Записан

2^7-1 == 127, задумайтесь...
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #22 : Август 26, 2011, 12:36 »

два независимых плагина, работающих в отдельных потоках, проводят инициализацию и сообщают об этом сигналами, основной поток не может продолжать работу дальше, пока они этого не сделают
Ну значит главная нитка должна принять эти сигналы и блокировать ее нельзя. А "остановить работу" можно напр так
Код
C++ (Qt)
while (true) {
if (plugin1Ready && plugin2Ready) break;
QThread::yieldCirrentThread();
QApplication::processEvents();
}
 
Записан
BRE
Гость
« Ответ #23 : Август 26, 2011, 12:58 »

где об этом написано?
Поищи в нете описание работы pthread_cond_wait.

Добавил: ну и в документации на QWaitCondition::wait все подробно расписано.
« Последнее редактирование: Август 26, 2011, 13:02 от BRE » Записан
Гурман
Гуру общения
******
Offline Offline

Сообщений: 1442

Qt 2.2, 3.3, 4.5, 4,7, 4.8, 5.3, 5.6, 5.9, 5.12


Просмотр профиля
« Ответ #24 : Август 26, 2011, 12:58 »

Цитировать
while (true) {
 if (plugin1Ready && plugin2Ready) break;
 QThread::yieldCirrentThread();
 QApplication::processEvents();
}

а вот это уже ерунда - загрузка процессора на 60%, плюс невозможность обработать ситуацию, когда один плагин не загружен, в варианте BRE такая обработка делается просто добавлением таймаута в wait( &m, 3000 ) - через 3 секунды, если плагины не проинициализировались (выясняется проверкой на то, что numThread по прежнему равен 2), катим дальше, выдаем сообщение об ошибке плагина, и нормально завершаемся
Записан

2^7-1 == 127, задумайтесь...
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #25 : Август 26, 2011, 14:42 »

в варианте BRE такая обработка делается просто добавлением таймаута в wait( &m, 3000 ) - через 3 секунды, если плагины не проинициализировались (выясняется проверкой на то, что numThread по прежнему равен 2), катим дальше, выдаем сообщение об ошибке плагина, и нормально завершаемся
Можно и так, но тогда без сигналов, и на 3 сек UI заморожен

а вот это уже ерунда - загрузка процессора на 60%, плюс невозможность обработать ситуацию, когда один плагин не загружен,
Про флажки для processEvents почитайте - чтоб не загружать процессор. И вообще - лучше сначала разобраться а потом резво кричать "ерунда-ерунда"  Улыбающийся
Умолкаю..
Записан
Гурман
Гуру общения
******
Offline Offline

Сообщений: 1442

Qt 2.2, 3.3, 4.5, 4,7, 4.8, 5.3, 5.6, 5.9, 5.12


Просмотр профиля
« Ответ #26 : Август 26, 2011, 14:46 »

Цитировать
тогда без сигналов

с сигналами, они из других потоков приходят, и нормально отрабатывают

Записан

2^7-1 == 127, задумайтесь...
SASA
Гость
« Ответ #27 : Август 26, 2011, 15:36 »

Цитата: Гурман link=topic=19234.msg129815#msg129815
ну в моем случае такого не будет
[/quote
Чтоб не думать о случаях, лучше всегда пользоваться QMutexLocker.

По теме. А не проще завести флаг типа intitOk. (код из головы)
Код:
enum intit
{
     notInit = 0,
     firstPlugOk = 1,
     secondPlugOk = 2,
     bothPlugOk = firstPlugOk | secondPlugOk
}
...
intit initOk = notInit;
...
while(initOk == bothPlugOk )
{
   // например, processEvent
}
...
if (!startInitPlug1()) // нет плагина
{
   firstInitFinished();
   parm = defVal;
}
....
void firstInitFinished()
{
    intit = intit |firstPlugOk;
}
Мы же не потоки ждём, а инициализацию.
Записан
Страниц: 1 [2]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.121 секунд. Запросов: 22.