2016-09-05 22 views
1
void MainWindow::on_pushButton_clicked() 
{ 
    QFuture<int> future = QtConcurrent::run(identify); //Thread1 
    if (future.isFinished()) 
    { 
     //DoSomething();  
    } 
} 

У меня этот код. Я хочу запустить функцию DoSomething() после завершения функции идентификации. Является ли это возможным?Как запустить функцию Qt после завершения потока?

+0

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

ответ

6

Вы можете передать объект QFuture на номер QFutureWatcher и подключить свой finished() сигнал к функции или в слот DoSomething().

Например:

void MainWindow::on_pushButton_clicked() 
{ 
    QFuture<int> future = QtConcurrent::run(identify); //Thread1 
    QFutureWatcher<int> *watcher = new QFutureWatcher<int>(this); 
      connect(watcher, SIGNAL(finished()), this, SLOT(doSomething())); 
    // delete the watcher when finished too 
    connect(watcher, SIGNAL(finished()), watcher, SLOT(deleteLater())); 
    watcher->setFuture(future); 
} 

void MainWindow::DoSomething() // slot or ordinary function 
{ 
    // ... 
} 

Или вы могли бы использовать вложенный цикл событий, чтобы держать GUI реагировать и иметь все внутри одной и той же функции:

void MainWindow::on_pushButton_clicked() 
{ 
    QFuture<int> future = QtConcurrent::run(identify); //Thread1 
    QFutureWatcher<int> watcher; 
    QEventLoop loop; 
    // QueuedConnection is necessary in case the signal finished is emitted before the loop starts (if the task is already finished when setFuture is called) 
    connect(&watcher, SIGNAL(finished()), &loop, SLOT(quit()), Qt::QueuedConnection); 
    watcher.setFuture(future); 
    loop.exec(); 

    DoSomething(); 
} 
+0

connect (& watcher, SIGNAL (finished()), & myObject, SLOT (handleFinished())); У меня вопрос, что я пишу вместо & myObject и handleFinished? –

+0

@NemethAttila Я добавил 2 примера. – alexisdm

+0

Спасибо, второй пример делает именно то, что я хотел. –