本文以 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
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
原文链接: http://www.cnblogs.com/xinxue/
专注于机器视觉、OpenCV、C++ 编程
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 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