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;
}
相关推荐
upgrador1 小时前
基础知识:C++ STL构造函数的左闭右开惯例及其实现原理
开发语言·c++
尘中远3 小时前
【Qwt 7.0 系列】坐标轴与刻度系统 —— 刻度引擎、网格、图例与刻度朝内
qt·数据可视化·qcustomplot·qwt·工业软件·科学绘图
凯瑟琳.奥古斯特3 小时前
K次取反最大化数组和解法(力扣1005)
开发语言·c++·算法·leetcode·职场和发展
林中青木4 小时前
CT重构原理及C++代码实现
c++·计算机视觉·重构
满天星83035774 小时前
Protobuf的介绍及使用
c++
☆cwlulu4 小时前
调试排查工具介绍(gdb、strace、Valgrind等)
开发语言·c++·嵌入式硬件·ubuntu
卷无止境4 小时前
C++ 存储类说明符(Storage Class Specifier)大横评
c++·后端
卷无止境5 小时前
C++ 编程的一大坑:非常量全局变量是"万恶之源"
c++·后端
C语言小火车5 小时前
C++ 快速排序(Quick Sort)深度精讲:分治思想、Lomuto 分区法及三数取中优化,面试手撕必会
c语言·开发语言·c++·面试·排序算法·快速排序
sycmancia5 小时前
Qt——多线程间的互斥
开发语言·qt