




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第QT线程QThread的使用介绍目录1.概述2.moveThread示例3.QThread示例4.总结
1.概述
QThread有两种使用方式
QObject::moveToThread()派生QThread的子类类
2.moveThread示例
步骤概述:
定义一个QObject派生类,在派生类中定义一个槽函数,此函数是用于执行具体的工作在要使用线程的类中,新建QThread和QObject派生类对象,并使用moveThread()将派生类的处理交由QThread将触发线程工作的信号与派生类的槽函数进行连接
ThreadWorker.hpp代码如下:
#ifndefTHREADWORKER_HPP
#defineTHREADWORKER_HPP
#includeQObject
#includeQString
#includeQThread
#includeQDebug
classThreadWorker:publicQObject
Q_OBJECT
public:
ThreadWorker(){}
publicslots:
voidwork(QStringp1)
qDebug()"currentthreadID:"QThread::currentThreadId();
qDebug()p1;
QThread::sleep(10);
qDebug()"threadrunfinish!";
#endif//THREADWORKER_HPP
ThreadController.hpp代码如下:
#ifndefTHREADCONTROLLER_H
#defineTHREADCONTROLLER_H
#include"ThreadWorker.hpp"
classThreadController:publicQObject
Q_OBJECT
QThreadworkerThread;
public:
ThreadController():QObject()
ThreadWorker*threadWork=newThreadWorker();
//将threadWork移交给workerThread
threadWork-moveToThread(workerThread);
QObject::connect(this,SIGNAL(touchWork(QString)),threadWork,SLOT(work(QString)));
QObject::connect(workerThread,QThread::finished,threadWork,QObject::deleteLater);
workerThread.start();//启动线程
qDebug()"currentthreadID:"QThread::currentThreadId()'\n';
emittouchWork("working");
~ThreadController()
workerThread.quit();
workerThread.wait();
signals:
//发出信号触发线程
voidtouchWork(QStringp1);
#endif//THREADCONTROLLER_H
main.cpp代码如下:
#includeQCoreApplication
#include"ThreadController.hpp"
intmain(intargc,char*argv[])
QCoreApplicationa(argc,argv);
ThreadControllertc=ThreadController();
returna.exec();
}
注意:
不能再cpp文件中使用QT的特性机制如信号槽,因为moc不会在cpp文件中处理这些机制。可以改,但比较麻烦,建议将类定义在头文件中即可。
3.QThread示例
方法概述:
定义一个QThread的派生类,并重载run()函数,在run()函数中写入具体的线程代码通过start()启动线程
CustomThread.hpp代码如下
#ifndefCUSTOMTHREAD_H
#defineCUSTOMTHREAD_H
#includeQThread
#includeQDebug
classCustomThread:publicQThread
Q_OBJECT
public:
CustomThread(){}
signals:
voidcustomThreadSignal();
publicslots:
voidcustomThreadSlot()
qDebug()"currentthreadID(inslotfunction):"QThread::currentThreadId()'\n';
protected:
voidrun()override
qDebug()"currentthreadID:"QThread::currentThreadId()'\n';
QThread::sleep(10);
qDebug()"threadrunfinish!";
emitcustomThreadSignal();
#endif//CUSTOMTHREAD_H
main.cpp代码如下
#includeQCoreApplication
#include"CustomThread.hpp"
intmain(intargc,char*argv[])
QCoreApplicationa(argc,argv);
qDebug()"mainthreadID:"QThread::currentThreadId();
CustomThreadcustomThread;
QObject::connect(customThread,CustomThread::customThreadSignal,customThread,CustomThread::customThreadSlot);
customThread.start();
returna.exec();
}
输出结果:
mainthreadID:0x6508
currentthreadID:0x6544
threadrunfinish!
currentthreadID(inslotfunction):0x6508
4.总结
moveToThread
此方式,要求把需要进行的工作全部封装在一个类中,将每一个任务定义为一个槽函数,并与之对应的信号进行关联,最后调用moveToThread将此类交QThread对象。QThread调用start()进行启动,之后每个任务由相应的信号进行触发然后执行。
QThread
此方式是要求基于QThread进行派生,对派生类进行run()函数的override。之后调用start()后,就会运行run()函数。但是
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 祭英雄敬忠魂课件
- 水利水电工程积累经验试题及答案
- 素描茄子美术课件
- 工程效益测算方法试题及答案
- 行政管理公共关系学考试优化试题及答案
- 汽车底盘设计关键技术解析
- 2024年水利水电工程考生回顾试题及答案
- 行政管理中工作的公共关系学试题及答案
- 电子商务平台入驻合同协议规范
- 投资合作协议修订
- 防晒知识科普课件
- 煤矿安全生产协同管理系统
- 铁路段扩能改造站房及生产生活房屋工程方案投标文件(技术方案)
- 2025四年级美术国测知识竞赛题库(104题附答案)
- 2025年《养老护理员》考试模拟练习题及答案
- 教师培训系列讲座:人工智能赋能教育教学
- 2025至2030中国注射用重组人脑利钠肽行业运行态势及未来趋势研究报告
- 2024年柳州城市职业学院春专任教师辅导员招聘考试真题
- 运输公司汛期管理制度
- 2025年瑜伽教练资格证考试题库:瑜伽教练基础瑜伽动作详解试题
- 情绪管理小学生课件
评论
0/150
提交评论