2015-06-30 4 views
0

Я бег 5 темы нижеПодождите, пока все параллельные потоки Qt закончил

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()).

+0

Как насчет того, чтобы начать создавать и стирать потоки, завершенные в отдельном потоке с помощью собственного (не GUI) цикла событий? –

+0

Я не хочу использовать нити низкого уровня здесь, я просто ищу, как я могу выйти из exec(), как только я закончил со всеми потоками? – NDestiny

+1

Как насчет использования сигналов и слотов? – Cits

ответ

2

Решение довольно просто: никогда не используйте waitForXxx методов в Qt. Они никогда не нужны.

Вместо этого вы должны подключаться к сигналу QFutureWatcher::finished(). См., Например, this answer.

По какой-то другой причине я не могу использовать QFutureWatcher(), чтобы узнать все готовые результаты.

Нет такой причины.

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