专栏电商日志财经减肥爱情
投稿投诉
爱情常识
搭配分娩
减肥两性
孕期塑形
财经教案
论文美文
日志体育
养生学堂
电商科学
头戴业界
专栏星座
用品音乐

Qt多线程的几种实现方式

  Qt多线程的实现方式有:
  1。继承QThread类,重写run()方法
  2。使用moveToThread将一个继承QObject的子类移至线程,内部槽函数均在线程中执行
  3。使用QThreadPool,搭配QRunnable(线程池)
  4。使用QtConcurrent(线程池)
  为什么要用线程池?
  创建和销毁线程需要和OS交互,少量线程影响不大,但是线程数量太大,势必会影响性能,使用线程池可以减少这种开销。
  一、继承QThread类,重写run()方法
  缺点:
  1。每次新建一个线程都需要继承QThread,实现一个新类,使用不太方便。
  2。要自己进行资源管理,线程释放和删除。并且频繁的创建和释放会带来比较大的内存开销。
  适用场景:QThread适用于那些常驻内存的任务。1mythread。h2ifndefMYTHREADH3defineMYTHREADH45includeQThread67classMyThread:publicQThread8{9public:10MyThread();11voidstop();1213protected:14voidrun();1516private:17volatileboolstopped;18};1920endifMYTHREADH1mythread。cpp2includemythread。h3includeQDebug4includeQString56MyThread::MyThread()7{8stoppedfalse;9}10111213voidMyThread::stop()14{15stoppedtrue;16}17181920voidMyThread::run()21{22qreali0;2324while(!stopped)25{26qDebug()QString(inMyThread:1)。arg(i);27sleep(1);28i;29}30stoppedfalse;31}1widget。h2ifndefWIDGETH3defineWIDGETH45includeQWidget6includemythread。h789QTBEGINNAMESPACE10namespaceUi{classWidget;}11QTENDNAMESPACE1213classWidget:publicQWidget14{15QOBJECT1617public:18Widget(QWidgetparentnullptr);19Widget();2021privateslots:22voidonstartButclicked();2324voidonstopButclicked();2526private:27Ui::Widgetui;28MyThreadthread;29};30endifWIDGETH1widget。cpp23includewidget。h4includeuiwidget。h56Widget::Widget(QWidgetparent)7:QWidget(parent)8,ui(newUi::Widget)9{10uisetupUi(this);11uistartButsetEnabled(true);12uistopButsetEnabled(false);13}1415Widget::Widget()16{17deleteui;18}192021voidWidget::onstartButclicked()22{23thread。start();24uistartButsetEnabled(false);25uistopButsetEnabled(true);26}2728voidWidget::onstopButclicked()29{30if(thread。isRunning())31{32thread。stop();33uistartButsetEnabled(true);34uistopButsetEnabled(false);35}36}
  二、使用moveToThread将一个继承QObject的子类移至线程
  更加灵活,不需要继承QThread,不需要重写run方法,适用于复杂业务的实现。
  注意,该业务类的不同槽函数均在同一个线程中执行。1worker。h2ifndefWORKERH3defineWORKERH45includeQObject67classWorker:publicQObject8{9QOBJECT1011public:12Worker();1314Worker();1516publicslots:17voiddoWork();1819voidanother();2021signals:22voidstopWork();2324};2526endifWORKERH1worker。cpp2includeworker。h3includeQDebug4includeQThread56Worker::Worker()7{89}101112Worker::Worker()13{1415}161718voidWorker::doWork()19{20qDebug()currentthreadidisQThread::currentThreadId();21emitstopWork();22}232425voidWorker::another()26{27qDebug()anothercurrentthreadidisQThread::currentThreadId();28emitstopWork();29}1dialog。h2ifndefDIALOGH3defineDIALOGH45includeQDialog6includeQThread7includeworker。h89QTBEGINNAMESPACE10namespaceUi{classDialog;}11QTENDNAMESPACE1213classDialog:publicQDialog14{15QOBJECT1617public:18Dialog(QWidgetparentnullptr);19Dialog();2021signals:22voidstartWork();23voidstartAnother();2425publicslots:26voidendThread();2728private:29Ui::Dialogui;30QThreadmpThread;31WorkermpWorker;32};33endifDIALOGH1dialog。cpp2includedialog。h3includeuidialog。h4includeQDebug56Dialog::Dialog(QWidgetparent)7:QDialog(parent)8,ui(newUi::Dialog)9{10uisetupUi(this);1112mpThreadnewQThread();13mpWorkernewWorker();1415connect(this,Dialog::startWork,mpWorker,Worker::doWork);16connect(this,Dialog::startAnother,mpWorker,Worker::another);17connect(mpWorker,Worker::stopWork,this,Dialog::endThread);18mpWorkermoveToThread(mpThread);19mpThreadstart();20emitstartWork();21emitstartAnother();22}2324Dialog::Dialog()25{26deleteui;27deletempThread;28deletempWorker;29}303132voidDialog::endThread()33{34qDebug()endThread;35mpThreadquit();36mpThreadwait();37}
  不过我为什么要用界面类呢?搞不懂!
  三、使用QThreadPool,搭配QRunnable
  QRunnable常用接口:
  boolQRunnable::autoDelete()const;
  voidQRunnable::setAutoDelete(boolautoDelete);QRunnable常用函数不多,主要设置其传到底给线程池后,是否需要自动析构;若该值为false,则需要程序员手动析构,要注意内存泄漏;
  QThreadPool常用接口:
  voidQThreadPool::start(QRunnablerunnable,intpriority0);
  boolQThreadPool::tryStart(QRunnablerunnable);start()预定一个线程用于执行QRunnable接口,当预定的线程数量超出线程池的最大线程数后,QRunnable接口将会进入队列,等有空闲线程后,再执行;priority指定优先级tryStart()和start()的不同之处在于,当没有空闲线程后,不进入队列,返回false
  业务类需要继承QRunnable,并且重写run()方法。注意,QRunnbale不是QObject的子类,可以发射信号,但用不了槽函数。
  优点:无需手动释放资源,QThreadPool启动线程执行完成后会自动释放。
  缺点:不能使用信号槽与外界通信。
  适用场景:QRunnable适用于线程任务量比较大,需要频繁创建线程。QRunnable能有效减少内存开销1myrunnable。h2ifndefMYRUNNABLEH3defineMYRUNNABLEH45includeQRunnable6includeQString789classMyRunnable:publicQRunnable10{11public:12MyRunnable(constQStringszThreadName);13voidrun();1415private:16QStringmszThreadName;17};1819endifMYRUNNABLEH1myrunnable。cpp2includemyrunnable。h3includeQDebug4includeQThread56MyRunnable::MyRunnable(constQStringszThreadName):mszThreadName(szThreadName)7{89}101112voidMyRunnable::run()13{14qDebug()Startthreadid:QThread::currentThreadId();15intiCount0;1617while(1)18{19if(iCount10)20{21break;22}2324qDebug()mszThreadNamecount:iCount;25QThread::msleep(500);26}27}1mian。cpp2includeQCoreApplication3includemyrunnable。h4includeQThreadPool56staticQThreadPoolgpThreadPoolNULL;78intmain(intargc,charargv〔〕)9{10QCoreApplicationa(argc,argv);1112MyRunnablepRunnable1newMyRunnable(1thread);13pRunnable1setAutoDelete(true);1415MyRunnablepRunnable2newMyRunnable(2thread);16pRunnable2setAutoDelete(true);1718gpThreadPoolQThreadPool::globalInstance();1920gpThreadPoolstart(pRunnable1);21gpThreadPoolstart(pRunnable2);2223gpThreadPoolNULL;2425returna。exec();26}
  四、使用QtConcurrent
  Concurrent是并发的意思,QtConcurrent是一个命名空间,提供了一些高级的API,使得在编写多线程的时候,无需使用低级线程原语,如读写锁,等待条件或信号。使用QtConcurrent编写的程序会根据可用的处理器内核数自动调整使用的线程数。这意味着今后编写的应用程序将在未来部署在多核系统上时继续扩展。
  QtConcurrent::run能够方便快捷的将任务丢到子线程中去执行,无需继承任何类,也不需要重写函数,使用非常简单。
  QtConcurrent常用接口:
  QFutureTQtConcurrent::run(Functionfunction,。。。)
  QFutureTQtConcurrent::run(QThreadPoolpool,Functionfunction,。。。)
  需要在pro文件中添加:QTconcurrent1main。cpp2includeQCoreApplication3includeQThread4includeQThreadPool5includeQtConcurrentQtConcurrent6includeQDebug7includeQFuture89staticQThreadPoolgpThreadPoolQThreadPool::globalInstance();1011classHELLO12{13public:14QStringhello(QStringszName)15{16qDebug()HelloszNamefromQThread::currentThreadId();17returnszName;18}1920voidrun()21{22QFutureQStringf3QtConcurrent::run(this,HELLO::hello,QString(Lily));23QFutureQStringf4QtConcurrent::run(gpThreadPool,this,HELLO::hello,QString(Sam));2425f3。waitForFinished();26f4。waitForFinished();2728qDebug()f3:f3。result();29qDebug()f4:f4。result();30}31};3233QStringhello(QStringszName)34{35qDebug()HelloszNamefromQThread::currentThreadId();36returnszName;37}3839intmain(intargc,charargv〔〕)40{41QCoreApplicationa(argc,argv);4243QFutureQStringf1QtConcurrent::run(hello,QString(Alice));44QFutureQStringf2QtConcurrent::run(gpThreadPool,hello,QString(Bob));4546f1。waitForFinished();47f2。waitForFinished();4849qDebug()f1:f1。result();50qDebug()f2:f2。result();5152HELLOh;53h。run();5455gpThreadPoolNULL;5657returna。exec();58}

国际乒联调整赛制,男女单打改为七局四胜伊藤美诚女双再度出战北京时间3月17日,新加坡大满贯赛也逐渐的接近尾声,也是越来越好看了。比赛的竞争也是越来越激烈。虽然之前不少的名将,比如中国的陈梦,王艺迪。日本乒协的张本智和,伊藤美诚。先后遭到淘平民版约基奇二进宫他展现传球造诣猛龙想进季后赛他是关键作为16年的首轮9号秀,来自奥地利的内线珀尔特尔在自己的母队猛龙其实并未获得太多机会,在球队的前两个赛季他基本上都是被当做一名苦力蓝领在使用,而在18年涉及到小卡和德罗赞那笔互换交安顺市U15和U17篮球比赛开赛来源安顺市人民政府安顺要闻3月16日,由市文体广电旅游局市教育局主办的安顺市U15U17篮球比赛火热开赛,比赛为期9天,共有39支队伍参赛,其中U15组19支队伍,U17组20支队勇士news一哥剧情报销,兰姆签约,嘴嫂发声,格林禁赛德拉蒙德格林由于技犯已满16次将缺席明日勇士连客的第二场,对阵亚特兰大老鹰队的比赛。这是本赛季NBA第二个荣获此殊荣的球员,上一个是灰熊队的狄龙布鲁克斯。此后,追梦每获得2次技犯,巴西埃利亚斯贾布尔西方应更多了解中国高质量发展巴西埃利亚斯贾布尔今年的中国两会有着特殊意义,是对全面建设社会主义现代化国家开局起步之年的工作进行安排部署,也为世界观察中国式现代化提供了一个重要窗口。尤其是包括全国人民代表大会开意天空那不勒斯球迷赛后欲报复法兰克福球迷,和警方发生冲突直播吧3月16日讯据意大利天半空体育报道,在欧冠获胜后,那不勒斯极端球迷试图报复此前挑衅的法兰克福球迷,并和警方发生冲突。在今天凌晨进行的欧冠18决赛次回合,那不勒斯主场30战胜法欧冠那不勒斯晋级八强3月15日,那不勒斯队球员奥斯梅恩进球后庆祝。新华社发(阿尔贝托林格利亚摄)当日,在意大利那不勒斯举行的20222023赛季欧洲足球冠军联赛八分之一决赛次回合比赛中,意甲那不勒斯队80后无限循环的一生,太真实了!今天是小漫画时间!来看看,你是不是也是酱紫的80后1。关于上学02关于带娃03关于写作业04关于干活都说羊毛出在羊身上,但我感觉我们这一届,只被薅了,没见毛。小时候写作业的时候,就盘点电视剧狂飙里的各色人物的精彩表演电视剧狂飙不仅突出了高启强和安欣一邪一正的形象,也以点带面,全面辐射,塑造了众多配角的形象,他们和主演一起相得益彰,刻画了有血有肉,立体丰满的人物角色,正是由于他们精彩的表演为这部山东曲阜军地联手种植双拥树青山绿水,金山银山。3月10日,山东省济宁市曲阜市退役军人事务局联合该市双拥小区如意小区居委会成员走进驻曲部队,开展浇灌双拥情让双拥之树长青军地义务植树活动,邀请到拥军40多年如一央视看走眼了!他是谁人设崩塌,卫国平厌女情绪溢出屏幕最近一部新剧闯进观众的视野,上线三天,站内播放量破万,还被官媒点名表扬,颇有爆款潜质,他就是张译领衔主演的他是谁。他是谁有优质悬疑剧拥有的一切特质惊悚悬疑的主线剧情渲染气氛的音乐层
杨紫的9幅美照,每幅都是珍藏款1。爱情是春天花朵的芬芳,爱情是夏日高照的艳阳,爱情是秋季丹桂的飘香,爱情是冬夜雪花的飞扬。美好的爱情,愿你早日拥有!2。刘海久了以后,突然撩起来上街会特别没有安全感,总觉得别人都鹰的重生李东生用37年将小厂TTK铸造成大国品牌TCL李东生先生李东生(1957年7月),出生于广东惠州,毕业于华南理工大学,企业家,TCL集团董事长兼CEO。1978年,李东生作为高考恢复后的第一批考生,考入华南理工学院(华南理工大OPPO员工推送系统版本失误要被罚50万元?回应称系误读近日,有认证为OPPO员工的网友在社交平台爆料称,OPPO准备发文新规定,员工因为发版本导致的事故,要倒扣员工工资,单人最高50万元,引发关注。9月19日,OPPO方面回应南都记者市值300亿体育品牌,进军咖啡来源直通IPO,文韩文静体育品牌开始在咖啡市场分羹了。据天眼查App显示,近日,特步(中国)有限公司日前申请注册3枚特咖啡商标,以及3枚XTEPCOFFEE商标。这意味着卖衣服的特(外代二线)伦敦时装周SimoneRocha品牌时装秀(外代二线)伦敦时装周SimoneRocha品牌时装秀9月18日,模特在英国伦敦时装周上展示SimoneRocha品牌2023春夏新款服装。新华社西霸9月18日,模特在英国伦敦时装医美返佣将被定性为商业贿赂?有中介自曝月入五六万,多家医美企业回应本文来源时代周报作者杜苏敏医美赛道会否迎来新变化?9月19日,医美概念股受挫。当天,华熙生物(688363。SH)爱美客(300896。SZ)跌超11,朗姿股份(002612。SZ高端品牌启示录为啥你抢不到苹果新手机?文李光斗今年是iPhone诞生的15周年,至今苹果已共发布了38款iPhone。自9月8日苹果召开秋季新品发布会,推出iPhone14系列以及AppleWatchAirpodsPr余承东称中国一些企业抄袭华为直接用也不给专利费IT之家9月19日消息,近日,在2022世界设计之都大会开幕式上,华为常务董事终端BGCEO余承东演讲表示,在很多行业,尤其中国的一些企业,他们在抄袭我们的设计。包括我们的一些专利2022中国酒业上市公司品牌价值榜发布茅台高达5445亿,TOP30企业品牌价值总计13285亿元每经记者范芊芊每经编辑张海妮图片来源摄图网500815050作为全球最大饮料酒生产和消费国,中国酒产品品种多酿造历史悠久产业规模大。面对品类及品牌繁多的酒产品,消费者在购买时,往往长三角房价12城8月二手住宅价格指数8城下跌视频加载中9月16日,国家统计局发布2022年8月70个大中城市二手住宅销售价格指数。其中,长三角12城8月二手住宅指数跌势明显,12个城市中有8个城市房价环比下跌,宁波徐州温州蚌李克强主持召开国务院常务会议原标题李克强主持召开国务院常务会议确定专项再贷款与财政贴息配套支持部分领域设备更新改造扩市场需求增发展后劲部署进一步稳外贸稳外资的举措助力经济巩固恢复基础确定优化电子电器行业管理的
友情链接:快好找快生活快百科快传网中准网文好找聚热点快软网