Я бег 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()).
Как насчет того, чтобы начать создавать и стирать потоки, завершенные в отдельном потоке с помощью собственного (не GUI) цикла событий? –
Я не хочу использовать нити низкого уровня здесь, я просто ищу, как я могу выйти из exec(), как только я закончил со всеми потоками? – NDestiny
Как насчет использования сигналов и слотов? – Cits