首页 > 编程语言 > 详细

第八十三课、另一种创建线程的方式

时间:2017-03-04 22:41:16      阅读:287      评论:0      收藏:0      [点我收藏+]

一、历史的痕迹

1、注意

(1)、面向对象的程序设计实践的早期工程中习惯于通过继承的方式扩展系统的功能

技术分享

2、现代软件架构技术

(1)、尽量使用组合的方式实现系统功能

(2)、代码中仅体现需求中的继承关系

3、通过继承方式实现新的线程类的事实

(1)、线程子类仅保护void run()函数不同接口部分完全相同

技术分享

4、结论

(1)、通过继承的方式实现多线程没有任何实际意义(只是为了得到线程入口而已)

(2)、QThread对应于操作系统中的线程

(3)、QThread用于充当一个线程操作的集合

(4)、应该提供灵活的方式指定线程入口函数

(5)、尽量避免void run()函数

二、QThread类的改进(run()已经不单单是纯虚函数)

技术分享

1、解决方案:信号与槽

(1)、在类中定义一个槽函数void tmain()作为线程入口函数

(2)、在类中定义一个QThread成员对象m_thread

(3)、改变当前线程的依附性到m_thread

(4)、连接m_thread的start()信号到tmain()

技术分享
#ifndef MYTHREAD_H
#define MYTHREAD_H

#include <QObject>
#include <QThread>

class SynThread : public QObject
{
    Q_OBJECT
public:
    explicit SynThread(QObject *parent = 0);
    void start();
    void terminate();
    ~SynThread();

protected slots:
    void tmain();
private:
    QThread m_thread;
    
};

#endif // MYTHREAD_H
同步型SynThread.h
技术分享同步型SynThread.cpp
技术分享
#ifndef ASYNTHREAD_H
#define ASYNTHREAD_H

#include <QObject>
#include <QThread>

class AsynThread : public QObject
{
    Q_OBJECT
public:
    static AsynThread* NewInstance(QObject *parent = 0);
    void start();
    void terminate();
    
private:
    QThread* m_thread;
    explicit AsynThread(QObject *parent = 0);
    ~AsynThread();
    
protected slots:
    void tmain();
    
};

#endif // ASYNTHREAD_H
异步型AsynThread.h
技术分享
#include "AsynThread.h"
#include <QDebug>

AsynThread::AsynThread(QObject *parent) :
    QObject(parent)
{
    m_thread = new QThread();//记得是在堆空间上创建线程对象

    moveToThread(m_thread);

    connect(m_thread, SIGNAL(started()), this, SLOT(tmain()));
}

AsynThread* AsynThread::NewInstance(QObject *parent)
{
    return new AsynThread(parent);
}

void AsynThread::tmain()
{
    qDebug() << "void SynThread::tmain() tid=" << QThread::currentThreadId();

    for(int i=0; i<10; i++)
    {
        qDebug() << "void SynThread::tmain() i=" << i;
    }

    qDebug() << "void SynThread::tmain() end";

    deleteLater();
}

void AsynThread::start()
{
    m_thread->start();
}
void AsynThread::terminate()
{
    m_thread->terminate();
}

AsynThread::~AsynThread()
{
    qDebug() << "AsynThread::~SynThread()";
}
异步型AsynThread.cpp
技术分享
#include <QtCore/QCoreApplication>
#include "SynThread.h"
#include "AsynThread.h"

void synthread()
{
    SynThread t;

    t.start();
}

void asynthread()
{
    AsynThread* at = AsynThread::NewInstance();

    at->start();
}

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    //synthread();

    asynthread();
    
    return a.exec();
}
main.cpp

三、小结

(1)、早期的Qt版本只能通过继承的方式创建线程

(2)、现代软件提倡以组合的方式代替继承

(3)、QThread应该作为线程的操作集合而使用

(4)、可以通过信号与槽的机制灵活指定线程入口函数

第八十三课、另一种创建线程的方式

原文:http://www.cnblogs.com/gui-lin/p/6502828.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!