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;
}
相关推荐
greentea_20132 小时前
Codeforces Round 65 A. Way Too Long Words(71)
c++
Overboom4 小时前
[C++] --- 常用设计模式
开发语言·c++·设计模式
Univin4 小时前
C++(10.4)
开发语言·数据结构·c++
YxVoyager4 小时前
Qt C++ :QLayout 布局管理
c++·qt
KyollBM4 小时前
每日羊题 (质数筛 + 数学 | 构造 + 位运算)
开发语言·c++·算法
Univin6 小时前
C++(10.5)
开发语言·c++·算法
AA陈超6 小时前
虚幻引擎UE5专用服务器游戏开发-33 在上半身播放组合蒙太奇
c++·游戏·ue5·游戏引擎·虚幻
qq_428639616 小时前
虚幻基础:组件间的联动方式
c++·算法·虚幻
怎么没有名字注册了啊7 小时前
C++后台进程
java·c++·算法
slim~8 小时前
CLion实现ini 解析器设计与实现
c++·后端·clion