Qtconcurrent - 从 gui 线程启动第二个线程的简单方法

Qtconcurrent - Easy way to start a second thread from gui thread

我想找到一种简单的方法来从我的应用程序的主 gui 线程开始一个冗长的操作。我有他的出口商对象,不隶属于任何线程。

void closeExporter()
{  
    // Run closing of object in a different thread:
        QFuture<void> future = QtConcurrent::run([=]()
        {
            m_pExporter->close();
        });

        while (!future.isFinished())
        {
            QApplication::processEvents();
        //  QThread::msleep(0);
            qDebug() << "waiting!";
        }
}   

我没有使用 waitForFinished() 函数,它会阻止任何我的 gui 线程变得无响应。它在一段时间内工作正常,调试打印停止,我的应用程序仍然没有响应。有人知道为什么会这样吗?

我认为,您应该使用 QFutureWatcher 作为可能的实现。下面的小例子说明了用法。

#include <QApplication>
#include <QFrame>
#include <QDebug>
#include <QHBoxLayout>
#include <QPushButton>
#include <QThread>
#include <QObject>
#include <QFutureWatcher>
#include <QMessageBox>
#include <QtConcurrent>

int main(int argc, char* argv[])
{
    QApplication a(argc, argv);
    auto frame = new QFrame;
    frame->setLayout(new QHBoxLayout);
    auto btn = new QPushButton("Start Thread");
    frame->layout()->addWidget(btn);

    QThread::currentThread()->setObjectName("Main Thread");

    QFutureWatcher<void> watcher;
    QObject::connect(&watcher, &QFutureWatcher<void>::finished, [frame,btn]() {
        QMessageBox::information(frame, "Done", QThread::currentThread()->objectName(), QMessageBox::StandardButton::Ok);
        btn->setEnabled(true);
    });

    QObject::connect(btn, &QPushButton::clicked, [btn,&watcher](){
        QFuture<void> future = QtConcurrent::run([]() {
            QThread::msleep(6000);
            qDebug() << QThread::currentThread()->objectName();
        });
        watcher.setFuture(future);
        btn->setDisabled(true);
    });

    frame->show();

    return a.exec();
}

毕竟原始代码工作正常。抱歉浪费你的时间。