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;
}
相关推荐
Tadecanlan8 分钟前
[C++面试] C++中各类括号的差异:[]、{}、<>、()
开发语言·c++·面试
_GR17 分钟前
2023年蓝桥杯第十四届C&C++大学B组真题及代码
c语言·c++·蓝桥杯
努力努力再努力wz20 分钟前
【c++深入系列】:类和对象详解(下)
java·运维·c语言·开发语言·c++
对方正在长头发丿27 分钟前
P1162 填涂颜色(BFS)
数据结构·c++·算法·蓝桥杯·宽度优先
菜就多练,以前是以前,现在是现在39 分钟前
Codeforces Round 1000 (Div. 2)
数据结构·c++·算法
明月醉窗台1 小时前
Qt 入门 3 之对话框 QDialog(1)
c语言·开发语言·c++·qt
Lenyiin1 小时前
2181、合并零之间的节点
c++·算法·leetcode·链表
虾球xz1 小时前
游戏引擎学习第207天
c++·学习·游戏引擎
痛&快乐着2 小时前
C#调用C++动态库时出现`System.DllNotFoundException`错误的解决思路
c++·c#
永不停转2 小时前
继承 QPaintEngine 利用 QSvgRenderer 从SVG 图片中提取路径(QPainterPath)的方法
c++·qt