QT программирование, функция запуска QtConcurrent
У меня есть программа, которая имеет класс MainWindow
что унаследовано от QMainWindow
, Я хочу запустить определенную функцию в новом потоке.
Так как я не могу унаследовать от QThread
так что лучшее решение - это использовать QtConcurrent
, Я хранил QtConcurrent
привести к QFuture
но, как упоминалось в документации QT, результат QtConcurrent
не может быть отменено QFuture::cancel
,
Я вижу некоторые вопросы, как у меня, но ответы на них, чтобы создать класс, который наследуется от QThread
что я не могу Так в чем же решение? Вот мои коды:
mainwindow.h:
using namespace std;
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
explicit MainWindow(QWidget *parent = 0);
~MainWindow();
...
private:
Ui::MainWindow *ui;
...
QFuture<void> future;
QFutureWatcher< void > futureWatcher;
QPushButton *stop_pushButton_=new QPushButton;
private slots:
...
void on_graph_pushButton_clicked();
void generateGraph();
void stopPushButtonClicked();
};
mainwindow.cpp:
void MainWindow::stopPushButtonClicked()
{
futureWatcher.setFuture(future);
futureWatcher.cancel();
futureWatcher.waitForFinished();
}
...
void MainWindow::on_graph_pushButton_clicked()
{
loadingOn();
future = QtConcurrent::run(this,&MainWindow::generateGraph);
}
void MainWindow::generateGraph()
{
InsertLogs::getInstance()->printStatus(USER_GENERATE_GRAPH);
GenGraph* gr=new GenGraph;
connect(this,&MainWindow::loadingOffSignal,this,&MainWindow::loadingOff);
graphType_=gr->generateGraph(persons_comboBox_->currentText(),
ui->graphResource1_comboBox->currentText(),
ui->graphResource2_comboBox->currentText(),
ui->graphType_comboBox->currentText());
InsertLogs::getInstance()->printSuccess(SYSTEM_GENERATE_GRAPH);
emit loadingOffSignal();
}
Когда я нажимаю на graph_pushButton
, generatedGraph
вызывается в новой теме, но когда я нажимаю на stop_pushButton
future
не останавливается и generatedGraph
Функция выполняется полностью.