等到所有Qt并发线程完成

时间:2015-06-30 09:32:59

标签: multithreading qt qtconcurrent

我正在运行5个主题,如下所示

for(int i=0; i< 5 ; i++
{
   QtConcurrent::run()
}

我想在这里等到所有线程都完成。

void QFutureSynchronizer::waitForFinished ()  is hanging my main GUI.

所以我想使用像QEventLoop :: exec();

这样的东西

但是一旦所有结果可用,如何退出这个exec()?

编辑:    - 我做了一些这样的事,对我有用

constructor()
{
   m_noOfThreadsFinished = 0;
   m_totalThreads = 5;

    for(int i=0; i< 5 ; i++
    {
       QFuture<void> l_future =  QtConcurrent::run();
       QPointer< QFutureWatcher<void> >  l_futurewatcher = new  QFutureWatcher<void>();
        connect(l_futurewatcher, SIGNAL(finished()), this, SLOT(FinishedThread()) );
        l_futurewatcher->setFuture(l_future);    
    }

    if(eventLoop != NUL)
          delete eventLoop;
    eventLoop = new QEventLoop(); // QPointer<QEventLoop> eventLoop; is class member

     //start event loop here, so that GUI wont block
     eventLoop->ecec(); 

    //do things after all threads finished
}

void FinishedThread() //slot 
{
    QFutureWatcher<void>* l_futurewatcher = static_cast< QFutureWatcher<void>* > (sender());
    l_futurewatcher->deleteLater();

   if( (++m_noOfThreadsFinished == m_totalThreads) && !m_processCancelled)
   {
        emit finishedreading();
   }
}

void FinishedAllThreads() //slot for finishedreading 
{
    killLocalEventLoop();
}

void killLocalEventLoop()
{
  //QPointer automatically make eventLoop to NULL, when it got deleted 
  eventLoop->quit();
  eventLoop->deleteLater();
}

注意:当人们知道所有线程都已完成时,人们可以问为什么我不能在FinishedThread()槽中执行操作,项目我正在努力强迫我做这些事情在构造函数中只有当所有线程都完成时(这可能不是你的情况,那么你可以在FinishedThread()槽中做事。)

1 个答案:

答案 0 :(得分:2)

解决方案很简单:不要在Qt中使用任何waitForXxx方法。它们永远不是必需的。

相反,您应该连接到QFutureWatcher::finished()信号。例如,请参阅this answer

  

由于某些其他原因,我无法使用QFutureWatcher()来了解所有已完成的结果。

没有这样的理由。