2015-01-12 4 views
0

Я хочу сделать условие в коде ждать, пока все нити не будут закончены в основной нити конечного интервала, следующее тестовый код ..Подождите, пока все нити не будут закончены в основном потоке с использованием 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.

+1

Не можете ли вы просто 'wait()' на всех потоках? –

ответ

3

При использовании импульс в дополнение к Qt является вариант, вы можете использовать нить группу и вызвать join_all, которая ждет, пока все потоки в группе не выполняются ,

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

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

+0

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

 Смежные вопросы

  • Нет связанных вопросов^_^