QFuture的使用:多线程与进度条

更新时间:2023-07-08 07:53:25 阅读: 评论:0

QFuture的使⽤:多线程与进度条
介绍
QFuture 类可以⽤来获取异步计算的结果(类似 std::future ),⼀般配合 Qt Concurrent 模块和 QFutureWatcher 类⼯作。在 Qt Creator 中搜索 concurrent 可以看到⼀些相关⽰例。官⽅⽰例中, QFuture ⼀般和 QFutureWatcher 配合,因为 QFuture 不是QObject ⼦类,没有信号槽。但是 QFuture 相关的接⼝会触发 QFutureCallOutEvent 事件,QFutureWatcher 接收该事件后发送对应信号。
相关类的对应基本介绍:
从⽬前的⽂档和⽰例来看,QFuture 主要是由 Qt Concurrent 的相关接⼝⽣成,⼀般操作如下:
//concurrent⽣成future
QFuture<void> future = QtConcurrent::run([this]{ /**/ });
//future设置给watcher进⾏监控
车各QFutureWatcher<void> theWatcher;
theWatcher.tFuture(future);
//future对应的操作结束,触发watcher信号
connect(&theWatcher,&QFutureWatcher<void>::finished,this,[this]{ /**/ });
本⽂的需求是实现⼀个展⽰多线程处理进度的进度条,但 QFuture 只有获取状态值的接⼝,⽽没有设置状态值的接⼝,这些都被封装在了 QFutureInterface 中。要实现需求,需要创建⼀个 QFutureInterface 对象,并⽤他来⽣成⼀个相关联的 QFuture 对象,再设置
给 QFutureWatcher 进⾏监测,在线程中我们操作 QFutureInterface 实例就能触发 QFutureWatcher 对应的信号。
功能实现
实现效果(GIF):
完整代码链接(GitHub):
主要实现代码(组件是在 ui 上拖的):
(其实这⾥遇到⼀个问题,就是调⽤ cancel 来取消的话,会异常结束或者卡死,所以暂时⽤的 pau 来结束,线程中判断是否 pau。还要注意⼀个问题是,pau 或者 cancel 后,后续的设置是不会触发信号的,所以我在线程中结束了pau。)
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
/
/QFuture类表⽰异步计算的结果
#include <QFuture>
//QFuture本⾝不带信号槽,可使⽤QFutureWatcher进⾏监控
#include <QFutureWatcher>
//QFutureInterface没有提供⽂档,出现于Qt源码
//QFuture与QFutureInterface的关系类似std::future与std::promi //QFutureInterface可⽤于⽣成QFuture
//在Qt类实现中,QFuture持有⼀个QFutureInterface成员
#include <QFutureInterface>
QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
MainWindow(QWidget *parent = nullptr);
~MainWindow();
private:
Ui::MainWindow *ui;李炎欣
//QFuture本⾝不带信号槽,可使⽤QFutureWatcher进⾏监控    QFutureWatcher<bool> myWatcher;
};
#endif // MAINWINDOW_H
#include "mainwindow.h"
#include "ui_mainwindow.h"
八的英文怎么写
#include <thread>
#include <QThread>
#include <QDebug>
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->tupUi(this);
connect(ui->btnStart,&QPushButton::clicked,[this](){
qDebug()<<"点击 start"<<QThread::currentThread();
if(!myWatcher.isFinished()){
qDebug()<<"⽼哥,当前任务还没结束,等等呗";
return;
}
QFutureInterface<bool> interface;
肯将衰朽惜残年
interface.tProgressRange(0,100);
myWatcher.tFuture(interface.future());
//QFutureInterface是允许拷贝的,⾥⾯有⼀个d指针
std::thread thread([this,interface]() mutable {
qDebug()<<"线程开始"<<QThread::currentThread();
//使⽤sleep模拟耗时处理过程
//使⽤sleep模拟耗时处理过程
bool result=true;
for(int i=0;i<10;i++)
{
//操作前判断是否结束
if(interface.isPaud()){法部
//pau后不接收值了
//interface.tProgressValueAndText(0,"Cancel");
result=fal;
/
/不恢复watcher不能收到消息
interface.tPaud(fal);
break;
}
//使⽤sleep模拟耗时处理过程
QThread::msleep(200);
//设置值前判断是否结束
if(interface.isPaud()){
result=fal;
interface.tPaud(fal);
break;
}
const int progress=(i+1)*10;
interface.tProgressValueAndText(
progress,
QString("已处理 %%1").arg(progress));
}
qDebug()<<"线程结束"<<QThread::currentThread();
});
thread.detach(); //分离不管他了,⽤future来确保退出
});
雅思学习计划connect(ui->btnCancel,&QPushButton::clicked,[this](){
qDebug()<<"点击 cancel"<<QThread::currentThread();
哺乳期可以喝红酒吗//因为调⽤cancel会异常,所以我先拿pau来实现结束标志位的设置,会在线程中判断该标志        //线程中的分段任务完成才会退出
myWatcher.pau();
});
//异步结果
connect(&myWatcher,&QFutureWatcher<bool>::finished,[=]{
qDebug()<<"任务已完成"<&sult();
sult()){
ui->label->tText("任务完成");
}el{
ui->label->tText("任务失败");
唱歌用哪里发音
}
});
connect(&myWatcher,&QFutureWatcher<bool>::paud,[=]{
qDebug()<<"任务已取消";
});
//进度条相关
ui->progressBar->tRange(0,100);
ui->progressBar->tValue(0);
connect(&myWatcher,&QFutureWatcher<bool>::progressValueChanged,[=](int value){
qDebug()<<"Value"<<value<<QThread::currentThread();
ui->progressBar->tValue(value);
});
connect(&myWatcher,&QFutureWatcher<bool>::progressTextChanged,[=](const QString text){        qDebug()<<"Text"<<text<<QThread::currentThread();
ui->label->tText(text);
});
}
MainWindow::~MainWindow() {
myWatcher.pau();
myWatcher.waitForFinished();    delete ui;
}
参考
⽂档:
博客:

本文发布于:2023-07-08 07:53:25,感谢您对本站的认可!

本文链接:https://www.wtabcd.cn/fanwen/fan/89/1072678.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:结束   实现   设置   任务   对应   信号   触发   判断
相关文章
留言与评论(共有 0 条评论)
   
验证码:
推荐文章
排行榜
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图