当前位置: 首页 > news >正文

QtConcurrent

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

QtConcurrent::run

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

运行普通函数
#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;
}
运行带参数的函数
#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;
}
运行成员函数
#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;
}
使用线程池
#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 函数用于对一个序列中的每个元素执行相同的函数。

非阻塞版本
#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;
}
阻塞版本
#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 类似,但它会返回一个新的序列,包含对每个元素执行函数后的结果。

非阻塞版本
#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;
}
阻塞版本
#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 操作结合起来,先对序列中的每个元素执行函数,然后将结果合并为一个单一的结果。

#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 的状态,并在任务完成时发出信号。

#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;
}

相关文章:

  • COBOL语言的网络安全
  • AGI大模型(11):RAG系统
  • 在全球化浪潮下如何加强供应链风险管理?
  • Java全栈面试宝典:JMM内存模型与Spring自动装配深度解析
  • 数据结构实验3.1:顺序栈的基本操作与进制转换
  • 2025 年山东保安员职业资格考试要点梳理​
  • 深度学习篇---num_works选择
  • 【python以打包的形式运行和脚本形式运行获取路径注意事项】
  • GStreamer开发笔记(一):GStreamer介绍,在windows平台部署安装,打开usb摄像头对比测试
  • Open CASCADE学习|读取点集拟合样条曲线(续)
  • 碰一碰发视频源头开发技术服务商
  • CentOS 7 yum 无法安装软件的解决方法
  • oracle 快速创建表结构
  • C语言基础20
  • 基于SpringBoot的“智慧医疗采购系统”的设计与实现(源码+数据库+文档+PPT)
  • 【题解】AtCoder AT_abc400_c 2^a b^2
  • d202547
  • AF3 OpenFoldMultimerDataModule类解读
  • 【零基础入门unity游戏开发——动画篇】Animation动画窗口,创建编辑动画
  • uniapp微信小程序地图marker自定义气泡 customCallout偶尔显示不全解决办法
  • 招聘网站做销售/网络优化的内容包括哪些
  • 做后台网站/服务营销论文
  • 什么网站ppt做的最好看/网站seo排名
  • 重庆建设网站公司哪家好/友链交换平台源码
  • 营销型网站传统网站/下载安装
  • 美国网站做调查赚钱可信吗/杭州网络