[Qt] QFuture和QFutureWatcher

[Qt] QFuture和QFutureWatcher

第一次看到这两个类,感觉很有意思,也很有用。整理如下:

先来说说QFuture:
QFuture类代表了一个异步调用的结果。而这个异步调用需要使用Qt Concurrent架构中的API。
QFuture让线程可以通过某个后期产生的结果来实现同步。这个结果可以是任何拥有默认构造函数和拷贝构造函数的类型。如果这个结果在调用其result(), resultAt(), 或者 results()方法时还没有准备好,QFuture将会一直等到结果准备好。可以通过它的isResultReadyAt()方法来检测结果是否准备好。对于QFuture对象需要准备多个结果的情况,其resultCount()方法会返回连续结果的数量。这意味着从0遍历到resultCount()总是安全的。QFuture提供了Java类型的遍历器QFutureIterator以及STL类型的遍历器QFuture::const_iterator,可以根据自己的编程习惯使用它们来遍历结果。
QFuture提供了很多方法来跟正在进行的异步调用交互。例如可以通过其candel()方法来取消执行。可以通过setPaused(),pause(), resume(), 或者 togglePaused()来停止执行。这里需要注意不是所有的异步执行都可以取消或者停止。例如通过QtConcurrent::run()的future是不能被取消的,而通过QtConcurrent::mappedReduced()获得的future则可以被取消。

可以通过progressValue(), progressMinimum(), progressMaximum(), and progressText()方法来获得执行的进度信息。waitForFinished()方法会导致当前线程阻塞只到异步执行结束。

异步执行的状态信息可以通过isCanceled(), isStarted(), isFinished(), isRunning(), 或者 isPaused()方法来获得。

QFuture是一个轻量级的引用计数类,可以直接使用值传递方式。

QFuture<void>比较特殊,它表示不返回异步调用的结果。任何QFuture<T>对象都可以赋值或者拷贝给QFuture<void>对象。QFuture<void>对于结果数据不需要而只需要状态或者进度信息的情况比较有用。

如果想通过信号槽来跟异步调用实现交互,则要使用下面的QFutureWatcher。
QFutureWatcher是为QFuture而生的。通过QFutureWatcher我们可以通过信号槽来监视一个QFuture。

通过setFuture()方法可以开始监视一个QFuture。

为了方便,QFuture的很多方法我们可以直接通过QFutureWatcher来访问,如progressValue(), progressMinimum(), progressMaximum(), progressText(), isStarted(), isFinished(), isRunning(), isCanceled(), isPaused(), waitForFinished(), result(), and resultAt(). The cancel(), setPaused(), pause(), resume(), and togglePaused(),这些方法都是以槽的形式出现的。

下面我们来看一下SDK中给出的例子:
  1. //构造QFutureWatcher以及连接信号槽
  2. MyClass myObject;
  3. QFutureWatcher<int> watcher;
  4. connect(&watcher, SIGNAL(finished()), &myObject, SLOT(handleFinished()));

  5. //开始异步调用
  6. QFuture<int> future = QtConcurrent::run(...);
  7. watcher.setFuture(future);
复制代码
上面这个例子本身没有问题。但我们经常会在类中使用QFutureWatcher,这时就要注意了,很多人在栈上构造QFutureWatcher,结果出问题了,qtcentre上就这么一个例子大家可以自己去看看:
http://www.qtcentre.org/threads/ ... -signal-not-working

原因很简单我就不说了




==================================
#include <QtCore>
 
// helloconcurrent/main.cpp
void hello()
{
    qDebug() << "Hello from thread " << QThread::currentThread();
}
 
int main(int argc, char *argv[])
{
    QCoreApplication app(argc, argv);
    ///重点分析下QFuture 和QtConcurrent这两个 关键字的用法!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
    QFuture<void> future = QtConcurrent::run(hello);//thread-self自己函数就是一个线程.  暂时不懂QFuture和QtConcurrent的具体用法。
    qDebug() << "hello from GUI thread " << QThread::currentThread();
    future.waitForFinished();
    return 0;
}
 
 
  • 4
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
2022年11月4日-2022年11月14日购买当前课程赠送课程学习地址如下:https://edu.csdn.net/course/detail/32434https://edu.csdn.net/course/detail/35658https://edu.csdn.net/course/detail/30223https://edu.csdn.net/course/detail/32408https://edu.csdn.net/course/detail/32429注:因赠送课程不会出现在已订阅课程列表中,以下课程学习地址一定要收藏保存。#课程服务 在线答疑:本课程设有专门的讨论留言区,学习中遇到任何问题,直接给老师留言即可,老师都会及时进行回复。远程协助:如果遇到复杂问题,老师还可进行远程协助,这个一般可不是一两百元的课程就能享受到的。源码分享:为了让大家更好的进行项目实战,老师还将课程中涉及到的所有源码分享给学员,按照视频中的提示进行下载即可。在CSDN分享C++ Qt开发知识已经有6年了,感谢众多博友对我的支持,了解到很多人对Qt的使用还是有些困扰,例如Qt环境搭建,Qt布局的使用,如何使用Qt编写复杂的界面,如何自定义非标控件,Qt如何和Web交互,Qt和后台接口如何交互等;经过这几年的整理,我决定出这套《Qt高级开发视频教程》,带领大家学习Qt高级开发知识,学习如何使用Qt开发企业级别的项目;通过本课程的学习,大家将会达到企业招聘的中高级要求。为了照顾零基础学员,本课程第一章会介绍Qt环境搭建、QtCreator / VS2019的基本使用方法,Qt整体架构、Qt信号机制,Qt内存管理等知识。即使没有Qt开发的学习经验,也能跟着课程顺利学习。课程核心知识点地图如下: 课程每章核心知识点介绍如下: 第一章:介绍Qt环境搭建、QtCreator / VS2019的基本使用方法,Qt整体架构、Qt信号机制,Qt内存管理等知识。第二章:了解到很多学员对于Qt界面布局很不熟悉,将会详细介绍Qt设计器布局,以及如何C++代码手写布局,从常见的企业级项目入手,带领大家学会各种布局的实现,例如WPS、腾讯会议、优酷、迅雷等界面的实现;界面布局会了,这是企业项目开发的第一步,还有更重要的无边框窗口,如何设计一个合理的无边框窗口很重要,第三/四章:详细介绍如何实现一个无边框窗口,如何自定义标题栏,如何实现拖拽拉伸;第四章将会介绍如何自定义非标控件,优化Qt界面。第五章:介绍Qt web混合编程,一个商用项目,必然会涉及到web交互,这也是很多Qt开发者的弱项,这一章讲详细介绍C++ Qt web混合开发。第六章:既然是做企业级项目,必然需要和后台交互,http编程也是必要的,将详细介绍http编程,用户注册,登录,后台接口请求等知识;通过第五、六章的学习,将会是你的Qt开发技术更上一层楼。第七章:介绍Qt并发编程,耗时任务处理,进程调用等知识。第八、九章:讲解 Qt 比较重要的知识,图形视图结构,以及MVD模式;通过这两章的学习,大家会对图形视图有更好的了解。第十章:本章是独立章节,主要介绍Qt中一些特殊技巧,项目编译,dpi适配、多语言等知识。第十一章:是我们的企业级项目实战:实现一个视频会议客户端,本项目可以进行多人视频通话,直播,桌面分享等功能,本项目我会从零开始,进行项目搭建,功能调试,bug fixed, 带领大家做一个企业级项目。希望通过本课程的学习,大家的C++ Qt开发技术能有质的飞越,能找到自己心仪的工作。课程中如果讲的不对的地方,请大家指出,我及时修正,我也只是一个普通开发者,也不是所有的技术都会,尽我所能,把我所会的教给大家,让我们一起为Qt的发展,尽一份绵薄之力。 下面是本课程一些项目的截图: 1 可以滑动的设置界面         2 所有图形的绘制       3 视频播放器          4 高仿youku界面         5 视频会议         相信通过本课程的学习,大家有能力实现绝大部分客户端项目,从此用C++ Qt再也不会有难写的界面。
QFuture和QFutureWatcherQt中的两个类,可以用于处理异步操作和等待异步操作的结果。具体用法如下: 1. 创建QFuture对象 QFuture对象表示一个异步操作的结果。您可以使用QtConcurrent库中的函数或者自己编写的函数来创建QFuture对象。例如: ``` QFuture<int> future = QtConcurrent::run([]() { // 执行一些耗时操作 return 42; }); ``` 上述代码使用QtConcurrent库的run函数执行一个匿名函数,并将返回值42存储在QFuture<int>类型的对象中。 2. 等待异步操作的结果 如果您需要等待异步操作的结果,可以使用QFuture对象的waitForFinished函数。例如: ``` future.waitForFinished(); int result = future.result(); ``` 上述代码中,waitForFinished函数会阻塞当前线程,直到异步操作完成。然后,通过result函数获取异步操作的结果。 3. 使用QFutureWatcher监视异步操作 QFutureWatcher是一个类,可以用于监视异步操作的进度和结果。您可以通过connect函数连接QFutureWatcher的信号和槽函数,来处理异步操作的进度或结果。例如: ``` QFutureWatcher<int> watcher; watcher.setFuture(future); connect(&watcher, &QFutureWatcher<int>::finished, []() { qDebug() << "异步操作已完成"; }); ``` 上述代码中,将QFuture对象future设置为QFutureWatcher对象watcher的监视对象,并连接QFutureWatcher的finished信号和一个匿名槽函数。当异步操作完成后,匿名槽函数会被调用,并打印一条调试信息。 4. 获取异步操作的结果 您可以使用QFutureWatcher对象的result函数获取异步操作的结果。例如: ``` watcher.waitForFinished(); int result = watcher.result(); ``` 上述代码中,waitForFinished函数会阻塞当前线程,直到异步操作完成。然后,通过result函数获取异步操作的结果。 总结: QFuture和QFutureWatcherQt中用于处理异步操作和等待异步操作结果的类。使用QtConcurrent库的函数或者自己编写的函数可以创建QFuture对象,使用QFutureWatcher可以监视异步操作的进度和结果。使用waitForFinished函数可以等待异步操作的完成,使用result函数可以获取异步操作的结果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值