Qt多线程编程续集

53 篇文章 2 订阅
53 篇文章 36 订阅

                  项目需要,又开始搞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的类槽函数在新线程中运行,而实体创建和析构时还是在主线程中。



评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值