Подождите, пока все потоки не будут завершены в основном потоке с использованием Qt/C++.

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

testClass::testClass()
{
    m_count = 0;
    m_flag = false;
    for( int i = 0; i < 3; i++)
    {
        QThread *thread = new QThread();
        WorkerThread *worker = new WorkerThread();

        connect(thread, SIGNAL(started()), worker, SLOT(startThread()));
        connect(worker, SIGNAL(workerFinished()), this, SLOT(threadFinished()));
        connect(worker, SIGNAL(workerFinished()), thread, SLOT(quit()));
        connect(thread, SIGNAL(finished()), worker, SLOT(deleteLater()));
        connect(thread, SIGNAL(finished()), thread, SLOT(deleteLater()));
        thread->start();
        m_workerList.append(worker);
     }
}

void testClass::threadFinished()
{
    // wait untill all thread are finished, how to achive this ?
    if(!m_flag)
    {
        // print << m_flag;
        m_flag = true;
    }
}

void WorkerThread::startThread()
{
    emit workerFinished();
}

здесь testClass находится в основном потоке, и я хочу, чтобы приложение ждало в слоте threadFinished, пока все потоки, которые я начал в конструкторе testClass, не закончатся, может ли кто-нибудь предложить лучший способ сделать это?

Я использую Qt 5.4.0 в Windows 7.


person Prady    schedule 12.01.2015    source источник
comment
Разве вы не можете просто wait() во всех темах?   -  person John Zwinck    schedule 12.01.2015


Ответы (1)


Если использование boost в дополнение к Qt является вариантом, вы можете использовать группу потоков и вызвать join_all, который ожидает, пока все потоки в группе не будут выполнены.

Кроме того, QThreadPool предоставляет функцию waitForDone() ("Ждет выхода каждого потока и удаляет все потоки из пула потоков"), однако вам, возможно, придется немного реструктурировать свои рабочие объекты, чтобы они соответствовали интерфейсу QRunnable.

Более простым решением было бы установить переменную-член QVector или QMap с одной записью для каждого потока и установить для них значение true, когда соответствующий поток завершится. Продолжайте выполнение программы в вашем слоте только тогда, когда все потоки достигли состояния "finished = true" в вашей переменной-члене.

person Daniel    schedule 12.01.2015
comment
Я реализовал третье решение, оно работает, в любом случае я хочу попробовать и второе, чтобы лучше понять классы qt. - person Prady; 12.01.2015