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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: синхронизация потоков  (Прочитано 3585 раз)
taifun
Гость
« : Сентябрь 21, 2011, 10:18 »

Здравствуйет!
Особо сильно тему синхронизации потоков не изучил, но хотелось бы сразу узнать - есть ли возможность синхронизовать два потока? Суть проблемы вот в чем:
     запускаю первый поток, который должен выполнять вычисление valX
     запускаем второй поток, у которого следующий алгоритм:
Код:
for(int i = 0; i <15; i++){
     выполняем 1 команду;
     выполняем 2 команду;
     .......
     запускаем поток 1;
     // и вот тут надо дождаться выполнения потока 1 и получение значения valX через сигнал слот
     .......
}
Записан
alexman
Гость
« Ответ #1 : Сентябрь 21, 2011, 10:23 »

А зачем вообще 1-ый поток, если вы его один фиг ждете?

А вообще посмотри QObject::connect с параметром Qt::BlockingQueuedConnection.
Записан
LisandreL
Птица говорун
*****
Offline Offline

Сообщений: 984


Надо улыбаться


Просмотр профиля
« Ответ #2 : Сентябрь 21, 2011, 10:28 »

Ну у потоков есть wait, isFinished;
Для парадигмы запустили поток-функцию и получили из него результат по окончании работы зачастую удобней использовать QtConcurrent::run.
Записан
taifun
Гость
« Ответ #3 : Сентябрь 21, 2011, 10:47 »

А зачем вообще 1-ый поток, если вы его один фиг ждете?

А вообще посмотри QObject::connect с параметром Qt::BlockingQueuedConnection.

Дело в том, что первый поток помимо вычисления valX, готовит данные для графика и посылает сигнал виджету с графиком, когда необходимо обновить изображение ... потому и использую поток что бы GUI "не заморозить". Вообще QObject::connect я и использую с параметром Qt::BlockingQueuedConnection. но тут есть небольщая сложность. сначала я вызываю функцию с необходимыми параметрами для потока (что я и имел ввиду в алгоритме под "запускаем поток 1"), которые присваиваю членам класса и потом в этой функции уже в самом конце выполнения вызываю start(QThread::NormalPriority), что конечно же приводит к неверному, точнее сказать к нежелаемому результату работы потоков ... может как-то можно сразу запустить поток передав параметры непосредственно ему.

Про wait() знаю, но как использовать это не понимаю, так как поток 1 ничего не знает про поток 2 и наоборот, а связь между ними сделал через сигнал/слот.
Записан
alexman
Гость
« Ответ #4 : Сентябрь 21, 2011, 11:14 »

Зачем вам два потока? У вас есть один поток, который не морозит gui-нитку. В нем все вычисления и делайте.

Ну или можно так:
Код:
for(int i = 0; i <15; i++){
     выполняем 1 команду;
     выполняем 2 команду;
     .......
     // и вот тут надо дождаться выполнения потока 1 и получение значения valX через сигнал слот
     thread->start();
     thread->wait();
     .......
}

Если же thread уже запущен, то надо ему сигнал с параметрами послать о вычислении. Ну далее можно флаг какой-нить дожидаться:
Код:
for(int i = 0; i <15; i++){
     выполняем 1 команду;
     выполняем 2 команду;
     .......
     // и вот тут надо дождаться выполнения потока 1 и получение значения valX через сигнал слот
     emit signal(parameters);
    
     while (!thread->isCalculated()) {
          sleep(timeout);
     }
     .......
}
« Последнее редактирование: Сентябрь 21, 2011, 11:20 от alexman » Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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