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;