Qt如何将一个为一个函数单独开启一个线程,主线程不阻塞

QFutureWatcher实现在线程中调用方法

一、QFutureWatcher是什么
GPT:

QFutureWatcher类是一个可以用来监视QFuture的类,它提供了关于QFuture的信息和通知。
例如进度、状态、结果等。它可以使用信号和槽与QFuture进行交互,例如取消、暂停、恢复等。
它还可以提供节流控制,当待处理的结果信号数量超过限制时,自动减慢QFuture的计算速度。

QFutureWatcher类的基本用法是:

创建一个QFutureWatcher对象,并连接到相关的信号。
使用QtConcurrent模块中的API启动一个异步计算,并返回一个QFuture对象。
使用setFuture()函数让QFutureWatcher开始监视QFuture对象。
使用future()函数获取由setFuture()设置的QFuture对象。
使用QFutureWatcher类中的函数访问QFuture对象的信息,例如progressValue()、isFinished()、result()等。
使用QFutureWatcher类中的槽函数控制QFuture对象的行为,例如cancel()、setPaused()等。
下面是一个使用QFutureWatcher的简单示例,其中包含progressValueChanged信号:
#include <QtConcurrent/QtConcurrent>
#include <QFutureWatcher>
#include <QCoreApplication>
#include <QDebug>

int main(int argc, char *argv[])
{
    QCoreApplication app(argc, argv);

    // 创建一个QFutureWatcher对象,并连接到progressValueChanged信号
    QFutureWatcher<void> watcher;
    QObject::connect(&watcher, &QFutureWatcher<void>::progressValueChanged, [](int progress) {
        qDebug() << "Progress changed:" << progress;
    });

    // 启动一个异步计算,并返回一个QFuture对象
    QFuture<void> future = QtConcurrent::run([]() {
        for (int i = 0; i < 100; i++) {
            QThread::msleep(100); // 模拟一些工作
            if (i % 10 == 0) {
                // 发送一个自定义事件,以便在UI线程中更新进度条
                QCoreApplication::postEvent(&watcher, new QEvent(QEvent::User));
            }
            // 设置进度值
            watcher.setProgressValue(i);
        }
    });

    // 让QFutureWatcher开始监视QFuture对象
    watcher.setFuture(future);

    return app.exec();
}

二、QFutureWatcher类用法
.pro

QT += concurrent
// An highlighted block
var foo = 'bar';

.h

#include <QFutureWatcher>

class FutureWatcherTest: public QObject
{
public:
    FutureWatcherTest();
    ~FutureWatcherTest();
	
	QFutureWatcher<bool> Watcher;

private slots:
    void SlotHandleFinished();//结果处理槽
}

	
//res函数执行结果,bool为结果数据类型	
QFuture<bool> res = QtConcurrent::run(&m_PosService,&xxfunciton所在类::xxfunction,xxfunction参数1,xxfunction参数2,...3,....4);
Watcher.setFuture(res);

.cpp

FutureWatcherTest::FutureWatcherTest()
{
	connect(&Watcher, &QFutureWatcher<bool>::finished, 
			this, &FutureWatcherTest::hkSlotHandleFinished);
}
	
void SlotHandleFinished()
{
    // 获取QFuture对象的结果
    bool res = Watcher.result();
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值