Qt 之 入门例程(二)
本文以 Qt 中的 QtConcurrent::run() 函数为例,介绍如何将函数运行在单独的线程中。
1 QtConcurrent::run()
QtConcurrent 是命名空间 (namespace),它提供了高层次的函数接口 (APIs),使所写程序,可根据计算机的 CPU 核数,自动调整运行的线程数目。
下面是 Qt 例程 runfunction,对应目录为 D:\Qt\Qt5.12.3\Examples\Qt-5.12.3\qtconcurrent\runfucntion
1.1 .pro 工程文件
使用 QtConcurrent 模块,需要在 .pro 中添加: QT += concurrent
QT += concurrent widgets
CONFIG += console SOURCES += main.cpp
1.2 main.cpp
#include <QString>
#include <QDebug>
#include <QThread>
#include <QApplication> #include "qtconcurrentrun.h" using namespace QtConcurrent; void func(QString name)
{
qDebug() << name << "from" << QThread::currentThread();
} int main(int argc, char **argv)
{
QApplication app(argc, argv); QFuture<void> fut1 = run(func, QString("Thread 1"));
QFuture<void> fut2 = run(func, QString("Thread 2")); fut1.waitForFinished();
fut2.waitForFinished();
}
用 QtConcurrent::run() 函数,分别将 func() 运行在两个不同的线程中,输出结果如下:
"Thread 1" from QThread(0x1b74fd2ebc0, name = "Thread (pooled)")
"Thread 2" from QThread(0x1b74fd534e0, name = "Thread (pooled)")
下面是 QtConcurrent::run() 的详细使用,阅读完 2 和 3,再看上面的 runfunction 例程,就容易理解了。
2 普通函数
2.1 将函数运行在某一个线程中
extern void func();
QFuture<void> future = QtConcurrent::run(func);
如果要为其指定线程池,可以将线程池的指针作为第一个参数传递进去
extern void func();
QThreadPool pool;
QFuture<void> future = QtConcurrent::run(&pool, func);
2.2 向该函数传递参数
需要传递的参数,则跟在函数名之后,依次加入
extern void FuncWithArguments(int arg1, const QString &string); int integer = ...;
QString string = ...; QFuture<void> future = QtConcurrent::run(FuncWithArguments,integer,string);
2.3 获取该函数的计算结果
extern QString Func(const QByteArray &input); QByteArray byte_array = ...; QFuture<QString> future = QtConcurrent::run(func, byte_array);
...
QString result = future.result();
3 成员函数
将类中的成员函数运行在某一个线程中,可将指向该类实例的 引用或指针 作为 QtConcurrent::run 的第一个参数传递进去,
常量成员函数一般传递 常量引用 (const reference),而非常量成员函数一般传递 指针 (pointer)
3.1 常量成员函数
在一个单独的线程中,调用 QByteArray 的常量成员函数 split(),传递给 run() 函数的参数是 bytearray
QByteArray bytearray = "hello world";
QFuture<QList<QByteArray> > future = QtConcurrent::run(bytearray, &QByteArray::split, ',');
...
QList<QByteArray> result = future.result();
3.2 非常量成员函数
在一个单独的线程中,调用 QImage 的非常量成员函数 invertPixels(),传递给 run() 函数的参数是 &image
QImage image = ...;
QFuture<void> future = QtConcurrent::run(&image, &QImage::invertPixels, QImage::InvertRgba);
...
future.waitForFinished();
// At this point, the pixels in 'image' have been inverted
参考资料:
Qt Assistant | Qt 5.12 | Qt Concurrent | Concurrent Run
Qt 之 入门例程(二)的更多相关文章
- Qt 之 入门例程 (一)
以 “Hello Qt” 为例,介绍如何建立一个 Qt 工程 . 1 QLabel 例程 QLabel 继承自 QFrame (继承自 QWidget),主要用来显示文本和图片. 1.1 Hell ...
- Qt 之 入门例程
以 “Hello Qt” 为例,介绍如何建立一个 Qt 工程 . 1 QLabel 例程 QLabel 用来显示文本和图片,它继承自 QFrame (而 QFrame 继承自 QWidget) 1. ...
- QT从入门到入土(二)——对象模型(对象树)和窗口坐标体系
摘要 我们使用的标准 C++,其设计的对象模型虽然已经提供了非常高效的 RTTI 支持,但是在某些方面还是不够灵活.比如在 GUI 编程方面,既需要高效的运行效率也需要强大的灵活性,诸如删除某窗口时可 ...
- PySide——Python图形化界面入门教程(二)
PySide——Python图形化界面入门教程(二) ——交互Widget和布局容器 ——Interactive Widgets and Layout Containers 翻译自:http://py ...
- 第15.10节 PyQt(Python+Qt)入门学习:Qt Designer可视化设计界面组件与QWidget类相关的组件属性详解
PyQt学习有阵子了,对章节的骨架基本考虑好了,准备本节就写组件的属性的,结果一是日常工作繁忙,经常晚上还要加班,二是Qt的组件属性很多,只能逐一学习.研究和整理,花的时间有点长,不过终于将可视化设计 ...
- QT从入门到入土(三)——信号和槽机制
摘要 信号槽是 Qt 框架引以为豪的机制之一.所谓信号槽,实际就是观察者模式.当某个事件发生之后,比如,按钮检测到自己被点击了一下,它就会发出一个信号 (signal).这种发出是没有目的的,类似广播 ...
- 无废话ExtJs 入门教程二十一[继承:Extend]
无废话ExtJs 入门教程二十一[继承:Extend] extjs技术交流,欢迎加群(201926085) 在开发中,我们在使用视图组件时,经常要设置宽度,高度,标题等属性.而这些属性可以通过“继承” ...
- 无废话ExtJs 入门教程二十[数据交互:AJAX]
无废话ExtJs 入门教程二十[数据交互:AJAX] extjs技术交流,欢迎加群(521711109) 1.代码如下: 1 <!DOCTYPE html PUBLIC "-//W3C ...
- Bootstrap入门(二)栅格
Bootstrap入门(二)栅格 Bootstrap入门(二)栅格 全局CSS样式--栅格 先引入本地的CSS文件(根据自己的文件夹,有不同的引入地址,我是放在一个新建的名为css的文件夹中) con ...
随机推荐
- 写入soap消息以及与soap消息通信
1.些了解一下soap消息的结构以及通信方式如下图:
- pymysql使用心得记录
-----------更新日志 16.7.29------------- (该记录对应文章<豆瓣电影Top250基本信息抓取 >) 折腾了将近两天才把mysql数据库功能给实现了. 经过 ...
- CodeBlocks常用重要快捷键大全!!
CodeBlocks常用操作快捷键 编辑部分: Ctrl + A:全选 Ctrl + C:复制 Ctrl + X: 剪切 Ctrl + V:粘贴 Ctrl + Z:撤销(后退一步) Ctrl + S: ...
- webstorm中关于vue的一些问题
在进行vue开发中,我使用了webstorm,但是过程坎坷艰辛,遇到了很多问题,我将问题和解决方案贴上,以作参考. 1.vue项目部署在webstorm中,第一个遇到的问题是,webstorm卡住了, ...
- RecyclerView中装饰者模式应用
近段时间一直在加班,在赶一个项目,现在项目接近尾声,那么需要对过去一段时间工作内容进行复盘,总结下比较好的解决方案,积累一些经验,我认为的学习方式,是「理论-实践-总结-分享」,这一种很好的沉淀方式. ...
- 【C++】智能指针详解(一):智能指针的引入
智能指针是C++中一种利用RAII机制(后面解释),通过对象来管理指针的一种方式. 在C++中,动态开辟的内存需要我们自己去维护,在出函数作用域或程序异常退出之前,我们必须手动释放掉它,否则的话就会引 ...
- iOS 关于js与OC相互调用的那些事
最近项目上使用js调用OC,OC再次调用JS,再次在JS页面上面回显数据. 项目中使用的是WKWebview,加载网路的URL,其实就是使用WK加载出来的H5网页,在项目中用的是H5网页有个识别按钮, ...
- 树莓派Raspberry实践笔记-简单方法安装minicom
[原创链接]:http://www.cnblogs.com/atsats/p/6665566.html 本文结合最新的Raspbain jessie,使用图形化的方式安装一款软件:串口调试工具mini ...
- 老李分享:loadrunner的java user脚本开发
老李分享:loadrunner的java user脚本开发 poptest在性能测试loadrunner的课程里,以web协议为主,同时也讲解其他协议的脚本开发,对于一个性能测试工程师需要掌握一个以上 ...
- 老李推荐:第14章6节《MonkeyRunner源码剖析》 HierarchyViewer实现原理-装备ViewServer-启动ViewServer
老李推荐:第14章6节<MonkeyRunner源码剖析> HierarchyViewer实现原理-装备ViewServer-启动ViewServer poptest是国内唯一一家培养 ...