qt 高并发编程及同步

news2024/11/17 0:04:28

高并发编程是指在同一时间处理多个任务的能力,通常用于提升应用程序的性能和响应速度。Qt提供了一系列强大的工具和类来实现高并发编程,包括多线程、异步编程和任务调度。

一、继承QThread

#include <QThread>

class Worker : public QThread {
    void run() override {
        for (int i = 0; i < 5; ++i) {
            qDebug() << "Worker thread running:" << i << " " << QThread::currentThreadId();
            QThread::sleep(1); // 模拟耗时操作
        }
    }
};



int main(int argc, char *argv[])
{

    QApplication a(argc, argv);

    Worker worker;
    worker.start();

    qDebug() << "main thread:" << QThread::currentThreadId();

    return a.exec();
}

二、使用moveToThread

class Worker : public QObject
{
    Q_OBJECT
public:
    ~Worker(){qDebug() << "~Worker";}

public slots:
    void doWork() {
        for (int i = 0; i < 5; ++i) {
            qDebug() << "Worker thread:" << QThread::currentThreadId() << "Iteration:" << i;
            QThread::sleep(1);
        }
        emit finished();
    }

signals:
    void finished();
};



int main(int argc, char *argv[])
{
    QApplication a(argc, argv);

    QThread *thread = new QThread;
    Worker *worker = new Worker;

    worker->moveToThread(thread);

    QObject::connect(thread, &QThread::started, worker, &Worker::doWork);
    QObject::connect(worker, &Worker::finished, thread, &QThread::quit);
    QObject::connect(thread, &QThread::finished, worker, &Worker::deleteLater);
    QObject::connect(thread, &QThread::finished, thread, &QThread::deleteLater);

    thread->start();

    qDebug() << "main thread:" << QThread::currentThreadId();


    return a.exec();
}

三、使用QtConcurrent

#include <QtConcurrent>
#include <QFuture>

int doHeavyWork(int value)
{
    qDebug() << value << " thread:" << QThread::currentThreadId();
    QThread::sleep(1); // 模拟耗时操作
    return value * 2;
}


int main(int argc, char *argv[])
{

    QApplication a(argc, argv);

    qDebug() << "main thread:" << QThread::currentThreadId();

    QFuture<int> future = QtConcurrent::mapped(QList<int>{1, 2, 3, 4, 5}, doHeavyWork);
    future.waitForFinished(); // 等待所有任务完成

    qDebug() << future.results(); // 输出结果

    return a.exec();
}

四、使用QThreadPool和QRunnable

class MyRunnable : public QRunnable {
public:
    MyRunnable() {
        //setAutoDelete(true); // 任务完成后自动删除
    }
    ~MyRunnable()
    {
        qDebug() << "~MyRunnable";
    }

    void run() override {
        qDebug() << "Running in thread:" << QThread::currentThread();
        QThread::sleep(1); // 模拟耗时操作
    }
};


int main(int argc, char *argv[])
{

    QApplication a(argc, argv);

    qDebug() << "main thread:" << QThread::currentThreadId();

    QThreadPool *pool = QThreadPool::globalInstance(); // 获取全局线程池

    for (int i = 0; i < 3; ++i)
    {
        MyRunnable *runnable = new MyRunnable();
        pool->start(runnable); // 提交任务到线程池
    }

    return a.exec();
}

五、同步

1、QMutex同步

class Worker : public QThread {
public:
    Worker(QMutex *mutex, int &sharedCounter)
        : m_mutex(mutex), m_sharedCounter(sharedCounter) {}

    void run() override {
        for (int i = 0; i < 5; ++i) {
            // 使用 QMutexLocker
            QMutexLocker locker(m_mutex);
            // 访问共享资源
            m_sharedCounter++;
            qDebug() << "Thread:" << QThread::currentThread() << "Counter:" << m_sharedCounter;
            // 锁会在 locker 析构时自动释放
            QThread::sleep(1);
        }
    }

private:
    QMutex *m_mutex;
    int &m_sharedCounter;
};


int main(int argc, char *argv[])
{

    QApplication a(argc, argv);

    qDebug() << "main thread:" << QThread::currentThreadId();

    QMutex mutex; // 创建互斥量
    int sharedCounter = 0; // 共享资源

    Worker worker1(&mutex, sharedCounter);
    Worker worker2(&mutex, sharedCounter);

    worker1.start(); // 启动线程1
    worker2.start(); // 启动线程2

    worker1.wait(); // 等待线程1完成
    worker2.wait(); // 等待线程2完成

    return a.exec();
}

2、QSemaphore同步

class Worker : public QObject {
    Q_OBJECT

public:
    Worker(QSemaphore *semaphore) : semaphore(semaphore) {}

public slots:
    void doWork() {
        for (int i = 0; i < 10; ++i) {
            semaphore->acquire();
            qDebug() << "Worker thread:" << QThread::currentThreadId() << "Iteration:" << i;
            semaphore->release();
            QThread::sleep(1);
        }
    }

private:
    QSemaphore *semaphore;
};



int main(int argc, char *argv[])
{

    QApplication a(argc, argv);

    qDebug() << "main thread:" << QThread::currentThreadId();

    QSemaphore semaphore(1);
    QThread thread1, thread2;
    Worker worker1(&semaphore), worker2(&semaphore);

    worker1.moveToThread(&thread1);
    worker2.moveToThread(&thread2);

    QObject::connect(&thread1, &QThread::started, &worker1, &Worker::doWork);
    QObject::connect(&thread2, &QThread::started, &worker2, &Worker::doWork);

    thread1.start();
    thread2.start();


    return a.exec();
}

qq群交流:698593923

觉得有帮助的话,打赏一下呗。。

           

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2172147.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

基于springcloud的药品销售系统

文未可获取一份本项目的java源码和数据库参考。 一、选题背景与意义 1. 选题背景 在日常医药管理中&#xff0c;面对众多的药品和众多不同需求的顾客&#xff0c;每天都会产生大量的数据信息。以传统的手工方式来处理这些信息&#xff0c;操作比较繁琐&#xff0c;且效率低下…

重头开始嵌入式第四十四天(硬件 ARM裸机开发)

目录 裸机开发 一、开发背景 二、开发特点 三、开发流程 四、应用领域 使用的软件硬件 软件&#xff1a;keil 硬件&#xff1a;三星S3C2440A JTAG 开发原理 ​编辑 开发步骤 ​编辑 点亮小灯 按键控制亮灭 裸机开发 ARM 裸机开发是指在没有操作系统的情况…

CUDAExample: 波纹示例

需要用到的已经封装好的辅助类&#xff1a; CPUAnimBitmap 定义个grid 和 block 的维度都是二维的 #include"cpu_anim.h" #include "cuda_runtime.h" #include <device_launch_parameters.h>#define DIM 512 static void CheckCudaErrorAux(const …

numpy is not available

在测试第一个程序的时候&#xff0c;出现Numpy is not available的错误&#xff0c;根据博客的办法知道是因为numpy与pytorch版本不一致造成的。 安装的时候&#xff0c;安装的是最新版的numpy&#xff0c;检查numpy的版本为2.1.1版。 根据pytorch与numpy版本对应表。我的pyt…

【Python报错已解决】NameError: name ‘torchvision‘ is not defined

&#x1f3ac; 鸽芷咕&#xff1a;个人主页 &#x1f525; 个人专栏: 《C干货基地》《粉丝福利》 ⛺️生活的理想&#xff0c;就是为了理想的生活! 专栏介绍 在软件开发和日常使用中&#xff0c;BUG是不可避免的。本专栏致力于为广大开发者和技术爱好者提供一个关于BUG解决的经…

AI知识库如何重塑电商行业的产品推荐系统

在数字化浪潮的推动下&#xff0c;电子商务行业正经历着前所未有的变革。其中&#xff0c;产品推荐系统作为连接消费者与商品的桥梁&#xff0c;其智能化与个性化水平直接影响着用户体验、转化率乃至整个平台的竞争力。随着人工智能&#xff08;AI&#xff09;技术的飞速发展&a…

大豆重测序-文献精读53

Natural variation in GmSW17 controls seed size in soybean GmSW17的自然变异控制大豆种子的大小 摘要 种子大小/重量在决定作物产量中起着重要作用&#xff0c;但在大豆中&#xff0c;仅有少数控制种子大小的基因被鉴定出来。在本研究中&#xff0c;我们进行了全基因组关联…

Java项目——苍穹外卖总结

附上本人代码连接&#xff1a;xiaoming325/sky-take-out (github.com) 项目概述 此项目是一个外卖点餐项目&#xff0c;分为商家端&#xff08;管理员端&#xff09;和用户端&#xff0c;商家端是一个网站&#xff0c;用户端是一个微信小程序&#xff0c;由于微信小程序没有上…

Java ERP管理系统源码解析:微服务架构实践Spring Cloud Alibaba与Spring Boot

在当今数字化浪潮的推动下&#xff0c;企业对于高效、稳定且易于扩展的管理系统需求日益增长。为了满足这一需求&#xff0c;我们精心打造了一款基于Java技术的鸿鹄ERP&#xff08;Enterprise Resource Planning&#xff09;管理系统。该系统充分利用了Spring Cloud Alibaba、S…

【刷题5】在排序数组中查找元素的第一个和最后一个位置

目录 一、题目解析二、思路—二分查找(二段性)1、查找最左端区间2、查找最右端区间 三、代码 一、题目解析 题目理解&#xff1a; 返回begin和end&#xff0c;是数组下标 二、思路—二分查找(二段性) 1、查找最左端区间 left和right移动问题&#xff1a; 循环条件问题&…

探索甘肃非遗:Spring Boot网站开发案例

1 绪论 1.1 研究背景 当前社会各行业领域竞争压力非常大&#xff0c;随着当前时代的信息化&#xff0c;科学化发展&#xff0c;让社会各行业领域都争相使用新的信息技术&#xff0c;对行业内的各种相关数据进行科学化&#xff0c;规范化管理。这样的大环境让那些止步不前&#…

2024年中国电子学会青少年软件编程(Python)等级考试(二级)核心考点速查卡

考前练习 2024年03月中国电子学会青少年软件编程&#xff08;Python&#xff09;等级考试试卷&#xff08;二级&#xff09;答案 解析 2024年06月中国电子学会青少年软件编程&#xff08;Python&#xff09;等级考试试卷&#xff08;二级&#xff09;答案 解析 知识点描述 …

如何利用 Kafka,实时挖掘企业数据的价值?

首先&#xff0c;问读者老爷们一个简单的问题&#xff0c;如果你需要为你的数据选择一个同时具备高吞吐 、数据持久化、可扩展的数据传递系统&#xff0c;你会选择什么样的工具或架构呢&#xff1f; 答案非常显而易见&#xff0c;那就是 Kafka&#xff0c;不妨再次套用一个被反…

vue el-cascader 级联选择器 多选实现默认勾选并回显前子项

文章目录 前言代码实现总结 前言 最近实现一个需求 接收传递过来的值 并在 el-cascader级联选择器 上 勾选回显出来 记录下代码实现 代码实现 <template><div id"app"><el-card class"box-card"><el-formref"form2"label…

YOLOv7改进之MAE主干: 超强ConvNeXtV2 升级版结构,当MAE+YOLO卷积高效涨点

目录 1,原理概述 2,代码改进 新增一个convnextv2.py文件,增加以下代码 修改部分 第二步:在yolo.py中加入以下代码 然后在 在yolo.py中配置找到./models/yolo.py文件下里的parse_model函数,将类名加入进去 参考代码 YOLOv7网络配置文件 1,原理概述 原文:https://…

MATLAB绘图基础9:多变量图形绘制

参考书&#xff1a;《 M A T L A B {\rm MATLAB} MATLAB与学术图表绘制》(关东升)。 9.多变量图形绘制 9.1 气泡图 气泡图用于展示三个或更多变量变量之间的关系&#xff0c;气泡图的组成要素&#xff1a; 横轴( X {\rm X} X轴)&#xff1a;表示数据集中的一个变量&#xff0c…

LED显示屏如何通过FMEA进行风险分析:打造无忧显示新境界

LED显示屏作为高科技产品&#xff0c;其性能受到多种因素的影响&#xff0c;包括但不限于设计缺陷、材料质量、制造工艺、使用环境等。任何环节的疏漏都可能导致显示屏出现亮度不均、色彩失真、故障频发等问题&#xff0c;进而影响用户体验和品牌形象。因此&#xff0c;通过FME…

信息安全工程师(23)网络安全体系相关模型

前言 网络安全体系相关模型是描述网络安全体系如何实现的理论框架和抽象模型&#xff0c;它们为理解和设计网络安全解决方案提供了系统化的方法。 1. PDR模型 提出者&#xff1a;美国国际互联网安全系统公司(ISS)核心内容&#xff1a;保护(Protection)、检测(Detection)、响应(…

WWW 2024最新论文分享┆用于用户响应预测的时间兴趣网络

目录 论文简介 1. 团队介绍 2. 研究背景及主要贡献 3. 方法 4. 实验及结果 5. 总结与展望 6. 参考文献 论文简介 本推文详细介绍了一篇上海交通大学高晓沨教授和陈贵海教授团队发表在顶级学术会议WWW 2024的最新论文《Temporal Interest Network for User Response Pre…

MySQL—索引机制详解

索引介绍 基本介绍 MySQL 官方定义索引为一种帮助数据库高效获取数据的结构&#xff0c;其本质是排好序的快速查找数据结构。数据库除了存储表中的数据&#xff0c;还维护一些额外的满足特定查找算法的数据结构&#xff0c;这些数据结构以某种方式指向实际的数据&#xff0c;…