Я хочу сделать условие в коде, чтобы дождаться завершения всех потоков в последнем слоте основного потока, следующий тестовый код ..
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.
Если использование boost в дополнение к Qt является опцией, вы можете использовать группу потоков и вызвать join_all, который ждет, пока все потоки в группе не будут завершены.
Кроме того, QThreadPool предоставляет функцию waitForDone () («ожидает выхода каждого потока и удаляет все потоки из пула потоков.»), Однако вам, возможно, придется немного реструктурировать рабочие объекты, чтобы соответствовать интерфейсу QRunnable.
Более простым решением было бы установить переменную-член QVector или QMap с одной записью для каждого потока и установить для них значение true, когда соответствующий поток завершится. Продолжайте выполнение программы в своем слоте, только когда все потоки достигли состояния «закончено = истина» в переменной-члене.