news 2026/6/11 2:08:12

程序:三线程并发 生产者 消费者---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/6/9 22:36:56

Q#单元测试+代码覆盖率(从零搭建VSCode监控环境)

第一章&#xff1a;Q# 程序的 VSCode 代码覆盖率在量子计算开发中&#xff0c;确保 Q# 程序的测试完整性至关重要。VSCode 作为主流开发环境&#xff0c;结合 .NET 测试工具链&#xff0c;可实现对 Q# 代码的覆盖率分析。尽管原生支持仍在演进&#xff0c;但借助间接工具链仍可…

作者头像 李华
网站建设 2026/6/10 9:13:00

3步搞定本地大模型PDF翻译:LM Studio终极配置手册

还在为PDF文档翻译发愁吗&#xff1f;担心学术论文中的数学公式翻译不准确&#xff1f;PDFMathTranslate结合LM Studio的本地大模型方案&#xff0c;为您提供完美的离线翻译体验。这个强大的组合不仅完全保护您的数据隐私&#xff0c;还能精准处理复杂的数学公式和专业术语。 【…

作者头像 李华
网站建设 2026/6/10 11:14:59

【紧急排查方案】:VSCode远程连接超时?立即检查这4个端口配置

第一章&#xff1a;VSCode 远程调试的端口映射在分布式开发和远程协作日益普遍的今天&#xff0c;VSCode 通过其强大的远程开发扩展&#xff08;Remote - SSH、Remote - Containers 等&#xff09;实现了高效的远程调试能力。其中&#xff0c;端口映射是实现本地 IDE 与远程服务…

作者头像 李华
网站建设 2026/6/11 0:15:11

从零打通Q#与Python函数通道:量子混合编程稀缺实战手册

第一章&#xff1a;从零构建Q#与Python互操作认知量子计算正逐步从理论走向实践&#xff0c;而微软的 Q# 语言为开发者提供了高效编写量子算法的能力。与此同时&#xff0c;Python 凭借其丰富的科学计算生态&#xff0c;成为最广泛使用的宿主语言之一。通过 Q# 与 Python 的互操…

作者头像 李华