0

我正在运行 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() 插槽中做事)。

4

1 回答 1

2

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

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

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

没有这样的理由。

于 2015-06-30T20:14:45.823 回答