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();
}