QT线程QThread的使用介绍_第1页
QT线程QThread的使用介绍_第2页
QT线程QThread的使用介绍_第3页
QT线程QThread的使用介绍_第4页
QT线程QThread的使用介绍_第5页
已阅读5页,还剩1页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第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. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论