QtConcurrent

以下是 QtConcurrent 的一些常见用法示例:

QtConcurrent::run

QtConcurrent::run 是最常用的函数,用于在单独的线程中运行一个函数。

运行普通函数
cpp 复制代码
#include <QtConcurrent>
#include <QDebug>
#include <QThread>

void myFunction()
{
    qDebug() << "Running in thread:" << QThread::currentThreadId();
}

int main()
{
    QFuture<void> future = QtConcurrent::run(myFunction);
    future.waitForFinished(); // 等待线程完成
    return 0;
}
运行带参数的函数
cpp 复制代码
#include <QtConcurrent>
#include <QDebug>
#include <QThread>

void myFunctionWithArgs(int arg1, const QString &arg2)
{
    qDebug() << "Running in thread:" << QThread::currentThreadId();
    qDebug() << "Arguments:" << arg1 << arg2;
}

int main()
{
    int arg1 = 42;
    QString arg2 = "Hello, world!";
    QFuture<void> future = QtConcurrent::run(myFunctionWithArgs, arg1, arg2);
    future.waitForFinished();
    return 0;
}
运行成员函数
cpp 复制代码
#include <QtConcurrent>
#include <QDebug>
#include <QThread>

class MyClass
{
public:
    void myMemberFunction()
    {
        qDebug() << "Running in thread:" << QThread::currentThreadId();
    }
};

int main()
{
    MyClass obj;
    QFuture<void> future = QtConcurrent::run(&obj, &MyClass::myMemberFunction);
    future.waitForFinished();
    return 0;
}
使用线程池
cpp 复制代码
#include <QtConcurrent>
#include <QDebug>
#include <QThread>
#include <QThreadPool>

void myFunction()
{
    qDebug() << "Running in thread:" << QThread::currentThreadId();
}

int main()
{
    QThreadPool pool;
    pool.setMaxThreadCount(4); // 设置线程池的最大线程数
    QFuture<void> future = QtConcurrent::run(&pool, myFunction);
    future.waitForFinished();
    return 0;
}

QtConcurrent::map

QtConcurrent::map 函数用于对一个序列中的每个元素执行相同的函数。

非阻塞版本
cpp 复制代码
#include <QtConcurrent>
#include <QDebug>
#include <QList>

void myFunction(int &value)
{
    value *= 2; // 对每个元素进行操作
}

int main()
{
    QList<int> list = {1, 2, 3, 4, 5};
    QFuture<void> future = QtConcurrent::map(list, myFunction);
    future.waitForFinished(); // 等待所有元素处理完成
    for (int value : list)
    {
        qDebug() << value;
    }
    return 0;
}
阻塞版本
cpp 复制代码
#include <QtConcurrent>
#include <QDebug>
#include <QList>

void myFunction(int &value)
{
    value *= 2;
}

int main()
{
    QList<int> list = {1, 2, 3, 4, 5};
    QtConcurrent::blockingMap(list, myFunction);
    for (int value : list)
    {
        qDebug() << value;
    }
    return 0;
}

QtConcurrent::mapped

QtConcurrent::mapped 函数与 QtConcurrent::map 类似,但它会返回一个新的序列,包含对每个元素执行函数后的结果。

非阻塞版本
cpp 复制代码
#include <QtConcurrent>
#include <QDebug>
#include <QList>

int myFunction(int value)
{
    return value * 2;
}

int main()
{
    QList<int> list = {1, 2, 3, 4, 5};
    QFuture<QList<int>> future = QtConcurrent::mapped(list, myFunction);
    QList<int> result = future.result(); // 获取结果
    for (int value : result)
    {
        qDebug() << value;
    }
    return 0;
}
阻塞版本
cpp 复制代码
#include <QtConcurrent>
#include <QDebug>
#include <QList>

int myFunction(int value)
{
    return value * 2;
}

int main()
{
    QList<int> list = {1, 2, 3, 4, 5};
    QList<int> result = QtConcurrent::blockingMapped(list, myFunction);
    for (int value : result)
    {
        qDebug() << value;
    }
    return 0;
}

QtConcurrent::mappedReduced

QtConcurrent::mappedReduced 函数将 mappedreduce 操作结合起来,先对序列中的每个元素执行函数,然后将结果合并为一个单一的结果。

cpp 复制代码
#include <QtConcurrent>
#include <QDebug>
#include <QList>

int myFunction(int value)
{
    return value * 2;
}

int reduceFunction(int sum, int value)
{
    return sum + value;
}

int main()
{
    QList<int> list = {1, 2, 3, 4, 5};
    QFuture<int> future = QtConcurrent::mappedReduced(list, myFunction, reduceFunction);
    int result = future.result(); // 获取最终结果
    qDebug() << "Result:" << result;
    return 0;
}

使用 QFutureWatcher

QFutureWatcher 可以用来监视 QFuture 的状态,并在任务完成时发出信号。

cpp 复制代码
#include <QtConcurrent>
#include <QFutureWatcher>
#include <QDebug>
#include <QThread>

void myFunction()
{
    qDebug() << "Running in thread:" << QThread::currentThreadId();
}

int main()
{
    QFutureWatcher<void> watcher;
    QObject::connect(&watcher, &QFutureWatcher<void>::finished, []()
    {
        qDebug() << "Task finished";
    });

    QFuture<void> future = QtConcurrent::run(myFunction);
    watcher.setFuture(future);

    // 主线程可以继续执行其他任务
    qDebug() << "Main thread continues to run";

    return 0;
}
相关推荐
千谦阙听4 小时前
C++类和对象(中):默认成员函数、构造与析构、拷贝构造、运算符重载
开发语言·c++·学习
weixin_307779135 小时前
一维无粘 Burgers 方程的激波形成问题:MacCormack 格式求解
c++·算法·matlab
HugoStudio_SWAN5 小时前
洛谷 B4500 / B4449 / B3843 凯撒密码、密码强度与密码合规——加密与安全的三道门
c++·学习·程序人生·算法·安全
雾里看山6 小时前
源码目录、构建目录与 out-of-source build
c++·软件构建·cmake
kaixin_learn_qt_ing7 小时前
Qt Model/View
qt
Quz7 小时前
QML MouseArea:鼠标拖拽与滚轮缩放
qt·qml
渡我白衣8 小时前
并查集:基础认识与模拟实现
android·java·javascript·数据结构·c++·算法·并查集
如意猴8 小时前
【C++】001--C++入门(1)
开发语言·c++
hetao17338378 小时前
2026-09-01~09-04 hetao1733837 的刷题记录
c++·算法
CHPCWWHSU9 小时前
DeepSeek-Harness-Qt将浏览器端Agent装入桌面应用
开发语言·qt