随笔 - 54  文章 - 0  评论 - 45  阅读 - 45万 

  本文以 Qt 中的 QtConcurrent::run() 函数为例,介绍如何将函数运行在单独的线程中。

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 

1
2
3
4
QT += concurrent widgets
CONFIG += console
 
SOURCES += main.cpp   

1.2  main.cpp

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#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() 运行在两个不同的线程中,输出结果如下: 

1
2
"Thread 1" from QThread(0x1b74fd2ebc0, name = "Thread (pooled)")
"Thread 2" from QThread(0x1b74fd534e0, name = "Thread (pooled)"

  下面是 QtConcurrent::run() 的详细使用,阅读完 2 和 3,再看上面的 runfunction 例程,就容易理解了。

 

2  普通函数

2.1  将函数运行在某一个线程中 

1
2
extern void func();
QFuture<void> future = QtConcurrent::run(func);   

  如果要为其指定线程池,可以将线程池的指针作为第一个参数传递进去

1
2
3
extern void func();
QThreadPool pool;
QFuture<void> future = QtConcurrent::run(&pool, func);  

2.2  向该函数传递参数

  需要传递的参数,则跟在函数名之后,依次加入 

1
2
3
4
5
6
extern void FuncWithArguments(int arg1, const QString &string);
 
 int integer = ...;
 QString string = ...;
 
 QFuture<void> future = QtConcurrent::run(FuncWithArguments,integer,string);   

2.3  获取该函数的计算结果 

1
2
3
4
5
6
7
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 

1
2
3
4
QByteArray bytearray = "hello world";
QFuture<QList<QByteArray> > future = QtConcurrent::run(bytearray, &QByteArray::split, ',');
...
QList<QByteArray> result = future.result();   

3.2  非常量成员函数

   在一个单独的线程中,调用 QImage 的非常量成员函数 invertPixels(),传递给 run() 函数的参数是 &image 

1
2
3
4
5
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

 

posted on   飞鸢逐浪  阅读(43305)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
历史上的今天:
2016-05-11 C++11 之 override
点击右上角即可分享
微信分享提示