资讯 更多 >>
漳州举办“数字工匠”职工职业技能...
河南4名阳性人员私自返乡并瞒报情况...
山西吕梁:发现盗采矿产资源行为可举报
受害方律师:接法院通知,乐安命案...
橙色——“柑橘院士”邓秀新心中最...
刷视频相认的双胞胎姐妹:两次创业...
四川通报2021年秋冬季首批大气污染...
首轮筛查:天津73443人全部阴性!
首席气象预报员张霞:30年坚守筑牢...
杭州火灾系二房东与房客纠纷引起 ...
动态更多 >>
天天快看点丨QPointer的概念及实例...
港股异动 | 东方甄选(01797)涨超4...
GPS排名前十的股票有哪些(2022年第...
“五一”消费市场见闻丨新能源汽车...
部编一下语文小壁虎借尾巴课堂笔记...
“五一”假期广东接待游客增长77.9%...
环球看点!提升种植智能化水平 发...
法国部分商品价格回落 9月全面降价...
【全球独家】家庭经济困难学生如何...
一季度全省实际利用内外资大幅增长
会展 更多 >>
美籍酿酒师在崇礼:中国是第二故乡...
河南项城报告2名疑似新冠肺炎病例 ...
浙江绍兴确诊病例首次零新增 上虞...
广西东兴实行全员居家隔离 启动口...
新疆全方位推进乡村振兴 “富春山...
云南瑞丽市主城区全员核酸检测结果...
内蒙古满洲里累计治愈出院本土确诊...
孙海洋夫妻驱车山东阳谷:还在为孙...
大国工匠追梦“玉米强国”40载:用...
让南海“海洋热带雨林”斑斓多彩
专题报道 
当前位置: 动态 > >> 正文
 
天天快看点丨QPointer的概念及实例(并发多线程实例)
来源:QT教程     时间:2023-05-05 12:52:23

基本概念

QPointer提供了模板类,这个包含指针主要是针对于QObject。

当对象被销毁的时候会被自动设置为0,解决了指针悬挂问题。这里QPointer中的T必须是QObject的子类,也就是identity type的Qt类。


(相关资料图)

QPinter的删除

对象树不能解决指针悬挂的问题:

1. QPointer为QObject提供了保护指针;

2. 当引用的对象被销毁时,QPointer会被设置为0;

3. 能适应任意的指针(保护指针自动转换为指针类型);

官方例子:

// ExampleObject is just QObject subclassQPointerobject(new ExampleQObject);delete object;if (object)qDebug() << ”Dangling pointer";elseqDebug() << "No dangling pointer";

这里本人做了一个涉及QPointer的实例

程序运行截图如下:

生产者生产数据,这个数据是QObject。然后有4-5个消费者去消费,在拿数据的时候加个锁,避免并发拿数据时出现问题:

QObject* ProjectData::getItem(){mutex.lock();if(m_objList.size() == 0){mutex.unlock();return nullptr;}QObject *ret = m_objList[0];m_objList.removeFirst();mutex.unlock();return ret;}

关键代码如下:

消费者线程:

#include "WorkerThread.h"#include "ProjectData.h"#include #include WorkerThread::WorkerThread(){stopFlag = false;qsrand(QTime(0, 0, 0).secsTo(QTime::currentTime()));}void WorkerThread::setProjectData(ProjectData *project){m_project = project;}void WorkerThread::run(){while(true){if(stopFlag){QThread::sleep(1);break;}QPointerptr = m_project->getItem();if(!ptr){QThread::sleep(1);continue;}//开始处理数据int disposeTime = qrand() % 5;qDebug() << "线程:" << QThread::currentThread() << "处理" << ptr << " 需要" << disposeTime << "S";QThread::sleep(disposeTime);delete ptr;//qDebug() << "ptr" << ptr;}}

调用及退出:

#include #include #include #include #include "WorkerThread.h"#include "ProjectData.h"int main(int argc, char *argv[]){QCoreApplication a(argc, argv);ProjectData *p = new ProjectData;//设置消费者线程WorkerThread *p1 = new WorkerThread;WorkerThread *p2 = new WorkerThread;WorkerThread *p3 = new WorkerThread;WorkerThread *p4 = new WorkerThread;WorkerThread *p5 = new WorkerThread;p1->setProjectData(p);p2->setProjectData(p);p3->setProjectData(p);p4->setProjectData(p);p5->setProjectData(p);p1->start();p2->start();p3->start();p4->start();p5->start();//设置生产者生产者QTimer timer;QObject::connect(&timer, &QTimer::timeout, [=](){QObject *test = new QObject;test->setObjectName("新数据ABC");p->addItem(test);qDebug() << "当前剩余资源:" << p->getSize();});timer.start(300);QTimer::singleShot(1000 * 20, [=]{p1->stopFlag = true;p2->stopFlag = true;p3->stopFlag = true;p4->stopFlag = true;p5->stopFlag = true;QEventLoop loop;QTimer::singleShot(1000 * 5, &loop, SLOT(quit()));loop.exec();delete p;qDebug() << "退出";qApp->quit();});return a.e

【领 QT开发教程 学习资料, 点击下方链接莬费领取↓↓ ,先码住不迷路~】

点击这里:

关键词:

热门推荐
猜你喜欢