项目需要,又开始搞qt的多线程编程。
QThread类并不是代表一个新的线程,而是QT提供的一个接口,用于控制一个子线程。每个QThread的实例就代表着对一个新线程的一个控制类。所以重写run函数,在我看来是很不恰当的,我讲的都是继承QObject类再使用moveToThread函数。
使用多线程就是希望有些工作能够分配给其他的线程来做,这是我们最关心的。
下面是我讲解的一个小小的例子,看一下多线程是怎么工作的。
直接上代码
#ifndef TESTOBJ_H
#define TESTOBJ_H
#include <QObject>
#include <QDebug>
#include <QThread>
class TestObj : public QObject
{
Q_OBJECT
public:
explicit TestObj(QObject *parent = 0);
~TestObj(){qDebug() << "obj ~" << '\n' << QThread::currentThreadId(); }
signals:
public slots:
void slt_printInfo() {
qDebug() << QThread::currentThreadId();
}
};
#endif // TESTOBJ_H
#include "testobj.h"
TestObj::TestObj(QObject *parent) :
QObject(parent)
{
}
#ifndef THREADMANAGE_H
#define THREADMANAGE_H
#include <QThread>
class ThreadManage
{
public:
ThreadManage(QThread *p_thread);
~ThreadManage();
QThread* value() const {
return p_h;
}
private:
QThread *p_h;
};
#endif // THREADMANAGE_H
#include "threadmanage.h"
#include <QDebug>
ThreadManage::ThreadManage(QThread *p_thread):
p_h(p_thread)
{
}
ThreadManage::~ThreadManage()
{
p_h->quit();
p_h->wait();
p_h->deleteLater();
qDebug() << "Thread ~~";
}
#include <QApplication>
#include <QPushButton>
#include "testobj.h"
#include "threadmanage.h"
int main(int argc, char* argv[])
{
QApplication app(argc,argv);
ThreadManage tm(new QThread());
ThreadManage tm2(new QThread());
TestObj *to = new TestObj;
TestObj to2;
to->moveToThread(tm.value());
to2.moveToThread(tm2.value());
tm.value()->start();
tm2.value()->start();
QPushButton button(QObject::tr("退出"));
QObject::connect(&button,SIGNAL(clicked()),to,SLOT(slt_printInfo()));
button.show();
qDebug() << QThread::currentThreadId();
return app.exec();
}
ThreadManage是我自己封装的简单的资源管理的类,TestObj继承QObject其中在析构函数和一个槽函数中输入线程的ID。看一下运行的结果
3055118144 是在主函数中的显示
2978155328 是那个槽函数
obj ~
3055118144 是一个析构函数,
从中我们可以看出,继承自QObject的类槽函数在新线程中运行,而实体创建和析构时还是在主线程中。