Russian Qt Forum

Qt => Вопросы новичков => Тема начата: taifun от Сентябрь 21, 2011, 10:18



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


Название: Re: синхронизация потоков
Отправлено: alexman от Сентябрь 21, 2011, 10:23
А зачем вообще 1-ый поток, если вы его один фиг ждете?

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


Название: Re: синхронизация потоков
Отправлено: LisandreL от Сентябрь 21, 2011, 10:28
Ну у потоков есть wait, isFinished;
Для парадигмы запустили поток-функцию и получили из него результат по окончании работы зачастую удобней использовать QtConcurrent::run.


Название: Re: синхронизация потоков
Отправлено: taifun от Сентябрь 21, 2011, 10:47
А зачем вообще 1-ый поток, если вы его один фиг ждете?

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

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

Про wait() знаю, но как использовать это не понимаю, так как поток 1 ничего не знает про поток 2 и наоборот, а связь между ними сделал через сигнал/слот.


Название: Re: синхронизация потоков
Отправлено: alexman от Сентябрь 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);
     }
     .......
}