Qt завершить процессы запущенные с помощью QtConcurrent

Рейтинг: 0Ответов: 2Опубликовано: 11.04.2015

Добрый день!

Имеется класс, в котором, с помощью QtConcurrent запускается метод с бесконечным циклом. Примерно такой:

#include "myclass.h"

MyClass::MyClass()
{
    QtConcurrent::run(this, &MyClass::myMethod);
}

void MyClass::myMethod()
{
    while (true) {
        QThread::sleep(10);
        // Тут делаем кучу полезных и важных дел...
    }
}

Подскажите пожалуйста, как корректно и быстро, завершить этот поток?

Ибо сейчас, всё работает нормально, ровно до тех пор пока я не вызову exit(0) из MainWindow, после этого программа зависает, очевидно ожидая, когда этот бесконечный процесс закончится.

Ответы

▲ 5Принят

В документации написано:

Note that the QFuture returned by QtConcurrent::run() does not support canceling, pausing, or progress reporting. The QFuture returned can only be used to query for the running/finished status and the return value of the function.

То-есть, QtConcurrent не поддерживает остановку.

Потому стоит добавить какой-то флаг, и перед закрытием приложения его переключать:

while(true) {
    if(aborted) {
        return;
    }
    // куча полезных дел
}

И перед exit(0):

aborted = true;
▲ 2

Из QtConcurrent::run() никак не выйти посредством QFuture. Только с использованием какой-нибудь переменной (флага), защищённой мьютексом. Ну а на выходе из программы, дабы не случился крах по причине всё ещё не завершившегося потока, добавьте: QThreadPool::globalInstance()->waitForDone()