Qt Concurrent Run 简述

QtConcurrent命名空间为了多线程编程提供了更高级别的API。使用QtConcurrent时,Qt会根据CPU的核数自动分配进程。然而,当需要与正在运行的线程进行通信时,则不能使用QtConcurrent来实现,并且不应将其用于处理阻塞操作。

其中,使用QtConcurrent::run()可以开辟一个单独的线程来运行我们定义的函数(可以在里面执行一些耗时或者需要并行的计算),QtConcurrent::run()返回一个QFuture模板类,用来处理函数的返回值。

1、运行不带参数的函数:void myFunction()

QFuture<void> future = QtConcurrent::run(myFunction); //myFunction包含在默认的QThreadPool中。
/*或者*/
QThreadPool pool;
QFuture<void> future = QtConcurrent::run(&pool, myFunction);//myFunction包含在指定的QThreadPool中。

2、运行带参数的函数:void myFunction(int n, QString str)

int n = 100;
QString str = "hello";
QFuture<void> future = QtConcurrent::run(myFuntion, n, str);

3、运行带返回值的函数:QString myFunction()

QFuture<QString> future = QtConcurrent::run(myFunction);

//执行其他操作...

QString result = future.result(); //注意:QFuture::result()会阻塞等待到返回结果 

4、运行类的成员函数:

/*run的第一个参数必须是const引用或者对象指针*/

/*1、对于const成员函数:*/
QByteArray bytearray = "hello world";
QFuture<QList<QByteArray> > future = QtConcurrent::run(bytearray, &QByteArray::split, ',');
//执行其他操作...
QList<QByteArray> result = future.result();

/*2、对于非const成员函数:*/
QImage image;
image.load (image_path);
QFuture<void> future = QtConcurrent::run(&image, &QImage::invertPixels, QImage::InvertRgba);
//执行其他操作...
future.waitForFinished();

5、运行Lambda函数:

QFuture<void> future = QtConcurrent::run([=]() {
    //在单独进程里执行
});

参考链接

1、Qt文档https://doc.qt.io/Qt-5/qtconcurrentrun.html

2、Qt QtConcurrent之 Run 函数用法https://blog.csdn.net/luoyayun361/article/details/80288610

3、QtQtConcurrent 使用方式https://www.cnblogs.com/Esperanto/p/8668627.html

4、Qt文档https://doc.qt.io/qt-5/thread-basics.html

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值