QT编程,QtConcurrent运行函数

时间:2018-01-15 10:14:18

标签: multithreading qt qtconcurrent qfuture

我有一个程序,其中包含继承自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函数完全执行。

0 个答案:

没有答案