news 2026/4/23 13:06:59

程序:三线程并发 生产者 消费者---QT

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
程序:三线程并发 生产者 消费者---QT

.h代码示例

#ifndefTHREAD_14_2_3_H#defineTHREAD_14_2_3_H/* 功能描述:使用三个线程 分别对公共资源进行操作 三个thread分别是一个生产者 两个消费者 写入: 将自己的资源写入公共资源中去 thread:str1 保存的来自公共资源 threadmain:str:公共资源 被其他资源读时 可以 ,但是不能一读一写。 规定 thread1 是生产者 thread 2 3 是消费者 */#include<QWidget>#include<QPushButton>#include<QHBoxLayout>#include<QVBoxLayout>#include<QReadLocker>#include<QWriteLocker>#include<QLabel>#include<QPlainTextEdit>#include<QThread>#include<QMutex>#include<QReadWriteLock>#include<QTime>classthreads;/* 生产者功能 添加:对buff进行添加 展示buff 里面都有什么东西 */classthread1:publicQThread{Q_OBJECTpublic:thread1(threads*parent);~thread1();public:voidrun()override;public:QString str1="生产者thread:";threads*parent;voidwrite();signals:voidwritetext(QString str);};/* 消费者 从这里面读取资源*/classthread2:publicQThread{Q_OBJECTpublic:thread2(threads*parent);~thread2();public:voidrun()override;public:QString str1="读者线程2:";threads*parent;signals:voidwritetext(QString str);};classthread3:publicQThread{Q_OBJECTpublic:thread3(threads*parent);~thread3();public:voidrun()override;public:QString str1="读者线程3:";threads*parent;signals:voidwritetext(QString str);};classthreads:publicQWidget{Q_OBJECTpublic:threads(QWidget*parent=nullptr);~threads();private:QPushButton*btnThread1Read=nullptr;QPushButton*btnThread1Write=nullptr;QLabel*thread1Label=nullptr;QPlainTextEdit*thread1Text=nullptr;QLabel*thread2Label=nullptr;QPushButton*btnThread2Read=nullptr;QPlainTextEdit*thread2Text=nullptr;QLabel*thread3Label=nullptr;QPushButton*btnThread3Read=nullptr;QPlainTextEdit*thread3Text=nullptr;QHBoxLayout*tophlay=nullptr;QHBoxLayout*centerhlay=nullptr;QHBoxLayout*bottomhlay=nullptr;QVBoxLayout*vlay=nullptr;voidsetui();privateslots:voidreadthread1();voidwritethread1();voidreadthread2();voidreadthread3();voidprinttext(QString str1);private:voidconnectSignals();public:thread1*t1=newthread1(this);thread2*t2=newthread2(this);thread3*t3=newthread3(this);enumStatue{stopped,running,paused};Statue statue=paused;private:QMutex mutex;public:QString buff1="公共资源buff ";QReadWriteLock lock;};#endif// THREAD_14_2_3_H

###代码.cpp

#include"thread_14_2_3.h"#include<QString>#include<QTimer>threads::threads(QWidget*parent):QWidget{parent}{setui();connectSignals();t1->start();t2->start();t3->start();}threads::~threads(){this->statue=stopped;t1->quit();t1->wait();t2->quit();t2->wait();t3->quit();t3->wait();}voidthreads::setui(){QSize btnSize={60,30};btnThread1Read=newQPushButton(this);btnThread1Read->setMinimumSize(btnSize);btnThread1Read->setText("读取");thread1Label=newQLabel(this);thread1Label->setText("thread1");btnThread1Write=newQPushButton(this);btnThread1Write->setMinimumSize(btnSize);btnThread1Write->setText("写入buff1");thread1Text=newQPlainTextEdit(this);btnThread2Read=newQPushButton(this);btnThread2Read->setMinimumSize(btnSize);btnThread2Read->setText("读取");thread2Label=newQLabel(this);thread2Label->setText("thread2");thread2Text=newQPlainTextEdit(this);btnThread3Read=newQPushButton(this);btnThread3Read->setMinimumSize(btnSize);btnThread3Read->setText("读取");thread3Label=newQLabel(this);thread3Label->setText("thread3");thread3Text=newQPlainTextEdit(this);tophlay=newQHBoxLayout();centerhlay=newQHBoxLayout();bottomhlay=newQHBoxLayout();tophlay->addWidget(thread1Label);tophlay->addWidget(btnThread1Read);tophlay->addWidget(btnThread1Write);tophlay->addWidget(thread1Text);centerhlay->addWidget(thread2Label);centerhlay->addWidget(btnThread2Read);centerhlay->addWidget(thread2Text);bottomhlay->addWidget(thread3Label);bottomhlay->addWidget(btnThread3Read);bottomhlay->addWidget(thread3Text);vlay=newQVBoxLayout(this);vlay->addLayout(tophlay);vlay->addLayout(centerhlay);vlay->addLayout(bottomhlay);this->setLayout(vlay);}//写线程 展示所有的线程的资源voidthreads::readthread1(){lock.tryLockForRead(1000);QString strall=QString("buff1:%1\nthread1:%2\n读线程thread2:%3\n读线程thread3:%4").arg(buff1).arg(t1->str1).arg(t2->str1).arg(t3->str1);thread1Text->appendPlainText(strall);lock.unlock();}//写线程 把 编辑框里面的内容 写入t1内voidthreads::writethread1(){lock.lockForWrite();QString str1=thread2Text->toPlainText();t1->str1=str1;t1->write();thread3Text->appendPlainText(QString("正在写入---buff1%1").arg(str1));QThread::msleep(700);//模拟5s的时间,写入时间lock.unlock();}//thread2 读公共资源到自己的成员中voidthreads::readthread2(){// thread3Text->appendPlainText(QString("正在尝试读取-buff1上锁\n"));// if(lock.tryLockForRead())// {// t2.str1 = buff1;// thread3Text->appendPlainText(QString("thread2正在读取---buff1%1").arg(t2.str1));// lock.unlock();// return;// }// thread3Text->appendPlainText(QString("thread2读取失败---str=%1").arg(t2.str1));}voidthreads::readthread3(){// thread3Text->appendPlainText(QString("正在尝试读取-buff1上锁\n"));// if(lock.tryLockForRead())// {// t3.str1 = buff1;// thread3Text->appendPlainText(QString("thread3正在读取---buff1%1").arg(t3.str1));// lock.unlock();// }// thread3Text->appendPlainText(QString("thread3读取失败---str=%1").arg(t3.str1));}voidthreads::printtext(QString str1){thread3Text->appendPlainText(str1);}voidthreads::connectSignals(){connect(btnThread1Read,&QPushButton::clicked,this,&threads::readthread1);connect(btnThread2Read,&QPushButton::clicked,this,&threads::readthread2);connect(btnThread3Read,&QPushButton::clicked,this,&threads::readthread3);connect(btnThread1Write,&QPushButton::clicked,this,&threads::writethread1);connect(t1,&thread1::writetext,this,&threads::printtext);connect(t2,&thread2::writetext,this,&threads::printtext);connect(t3,&thread3::writetext,this,&threads::printtext);}thread1::thread1(threads*parent):parent(parent){}thread1::~thread1(){}voidthread1::run(){while(1){msleep(1000);qDebug()<<"报告长官,生产者thread1号正在生产";parent->lock.lockForWrite();QString str1=QTime::currentTime().toString();parent->buff1=str1;QString all=QString("%1写入成功").arg(str1);emitwritetext(all);msleep(300);parent->lock.unlock();if(parent->statue==threads::stopped)break;}}voidthread1::write(){parent->buff1=this->str1;}thread2::thread2(threads*parent):parent(parent){}thread2::~thread2(){}voidthread2::run(){while(1){msleep(500);QString str="读取失败 芜湖! 起飞!";qDebug()<<"报告长官,消费者thread2号正在读取";if(parent->lock.tryLockForRead(50)){str=parent->buff1;this->str1=str;QString all=QString("%1读取成功").arg(str);emitwritetext(all);msleep(300);parent->lock.unlock();}else{emitwritetext(str);msleep(150);}if(parent->statue==threads::stopped)break;}}thread3::thread3(threads*parent):parent(parent){}thread3::~thread3(){}voidthread3::run(){while(1){msleep(500);QString str="读取失败 芜湖! 起飞!";qDebug()<<"报告长官,消费者thread3号正在读取";if(parent->lock.tryLockForRead(50)){str=parent->buff1;this->str1=str;QString all=QString("%1读取成功").arg(str);emitwritetext(all);msleep(300);parent->lock.unlock();}else{emitwritetext(str);msleep(150);}if(parent->statue==threads::stopped)break;}}
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/18 7:35:20

Blender建筑生成神器building_tools实战指南

Blender建筑生成神器building_tools实战指南 【免费下载链接】building_tools Building generation addon for blender 项目地址: https://gitcode.com/gh_mirrors/bu/building_tools 还在为复杂的建筑建模而烦恼吗&#xff1f;Blender的building_tools插件将彻底改变你…

作者头像 李华
网站建设 2026/4/12 16:25:47

别再手动push了!用Docker Buildx实现自动镜像推送的4种最佳实践

第一章&#xff1a;Docker Buildx 镜像推送的变革意义 Docker Buildx 作为 Docker 官方提供的高级镜像构建工具&#xff0c;彻底改变了传统镜像构建与推送的工作模式。它不仅支持多架构构建&#xff08;multi-arch&#xff09;&#xff0c;还允许开发者在单次构建中生成适用于不…

作者头像 李华
网站建设 2026/4/20 11:23:18

配置难题一网打尽,深度解读量子模拟器VSCode扩展最佳实践

第一章&#xff1a;量子模拟器 VSCode 扩展的配置为在本地开发环境中高效编写和调试量子程序&#xff0c;配置支持量子模拟的 Visual Studio Code 扩展至关重要。通过集成 Q# 语言支持与量子模拟器工具链&#xff0c;开发者可在熟悉的编辑器中实现语法高亮、智能提示和即时仿真…

作者头像 李华
网站建设 2026/4/16 12:31:19

5分钟搞定神经网络可视化:PlotNeuralNet终极使用指南

5分钟搞定神经网络可视化&#xff1a;PlotNeuralNet终极使用指南 【免费下载链接】PlotNeuralNet Latex code for making neural networks diagrams 项目地址: https://gitcode.com/gh_mirrors/pl/PlotNeuralNet 还在为论文配图发愁吗&#xff1f;想要一键生成专业级神经…

作者头像 李华
网站建设 2026/4/23 1:44:25

5分钟速成Pyecharts关系图:从零构建专业级网络可视化

5分钟速成Pyecharts关系图&#xff1a;从零构建专业级网络可视化 【免费下载链接】pyecharts &#x1f3a8; Python Echarts Plotting Library 项目地址: https://gitcode.com/gh_mirrors/py/pyecharts 还在为复杂的关系数据可视化发愁吗&#xff1f;Pyecharts Graph图让…

作者头像 李华
网站建设 2026/4/19 0:17:03

ArkUI双范式超级实战-鸿蒙社区App 第一季

在鸿蒙生态快速演进的今天&#xff0c;应用开发不再只是功能实现&#xff0c;更是用户体验的艺术。作为 HarmonyOS 官方推荐的 UI 开发框架&#xff0c;ArkUI 以“声明式”与“类 Web”双范式并行的独特架构&#xff0c;为开发者提供了前所未有的灵活性与表达力。而要真正释放其…

作者头像 李华