Заставить основной поток ждать, пока все остальные Qthread не закончатся

есть ли способ заставить основной поток ждать, пока все потоки, созданные из него, закончат свою работу, прежде чем завершить программу. Я имею в виду:

int main(){
    QthreadClass a; // in cons' a thread is created and running
    QthreadClass b; // same as before

    *** wish to wait till both created thread finished their jobs ***

    return 0;

}


person kakush    schedule 10.03.2013    source источник


Ответы (2)


Ну а насчет:

a.wait();
b.wait();

Или вы бы предпочли запустить цикл событий (как обычно для приложений Qt), который вы завершаете, когда оба ваших потока заканчиваются (QThread выдает сигналы Finished() и Terminated()).

person Archie    schedule 10.03.2013
comment
+1, я как раз писал это, когда ты меня опередил. Вот документация по QThread::wait - person tmpearce; 10.03.2013
comment
@tmpearce Извините за это :) И правильно, документы Qt - лучшее место для поиска в первую очередь. - person Archie; 10.03.2013

Обычно с Qt у вас будет класс на основе QApplication с циклом событий с сигналами и слотами, который не выйдет из основной функции, пока вы этого не захотите. В этом случае вы можете просто подключить сигнал QThread::finish() к слоту, который проверяет, все ли потоки выполнены.

Без цикла событий и сигналов/слотов потоки Qt не имеют метода join(), который можно найти в других реализациях потоков, но QThread::wait() несколько похож.

bool QThread::wait(unsigned long time = ULONG_MAX)

Блокирует поток до тех пор, пока не будет выполнено одно из следующих условий:

  • Поток, связанный с этим объектом QThread, завершил выполнение (т. е. когда он возвращается из QThread::run()). Эта функция вернет true, если поток завершится. Он также возвращает true, если поток еще не запущен.
  • Прошло time миллисекунд. Если время равно ULONG_MAX (по умолчанию), то время ожидания никогда не истечет (поток должен вернуться из QThread::run()). Эта функция вернет false, если время ожидания истекло.

Обратите внимание, что считается ужасной практикой блокировать основной поток, даже не с вычислением, не говоря уже о том, чтобы просто ждать чего-то. Все, что превышает несколько десятков миллисекунд, оказывает пагубное влияние на работу пользователя, а более высокие задержки могут дать вам сообщение «это приложение не отвечает» от ОС. Если вы ждете результата, дождитесь его в другом потоке и передайте его основному потоку только после того, как он будет выполнен.

person dtech    schedule 10.03.2013