QT 线程继承QThread与MoveToThread的区别

QThread与MoveToThread的基本使用指南

QThread使用例程

继承QThread类ThreadInherit.h

	class ThreadInherit : public QThread
	{
		Q_OBJECT
	public:
		ThreadInherit();
		~ThreadInherit();
	signals:
	public slots:
		void __onTimeOut();
	protected:
		virtual void run() override;
	private:
		QTimer* m_timer;	
	}

__继承QThread类ThreadInherit.cpp __
(1)定时器在构造函数里面运行

	ThreadInherit::ThreadInherit()
	{
		m_timer = new QTimer();
		connect(m_timer,SIGNAL(timeout()),this,SLOT(__onTimeOut()));
		m_timer->start(1000);
	}

(2)定时器在重写的run()函数里面运行

void ThreadInherit::run()
{
    qDebug() << "ThreadInherit - Thread-ID: " << QThread::currentThreadId();
    m_timer = new QTimer();
    connect(m_timer,SIGNAL(timeout()),this,SLOT(__onTimeOut()));
    m_timer->start(1000);
	//此处一定要加exec()
    this->exec();
}

为什么重写run函数里一定要加this->exec()?不加会怎样?
(1)不加exec运行结果:
不加exec()运行结果

(2)加exec运行结果:
加exec()运行结果
对比得出结论:
不加exec(),好像定时器没起作用一样,其实是运行一次就结束了。加了exec()想相当于一直在运行
具体原因见链接:
Qt事件循环(QCoreApplication::processEvents,exec)的应用

MoveToThread使用例程

MoveToThread类ThreadGoto.h

class ThreadGoto : public QObject
{
    Q_OBJECT
public:
    explicit ThreadGoto(QObject *parent = nullptr);

signals:

private slots:
    void ThreadRun();
    void __onTimeOut();

private:
    QThread *m_thead;

    QTimer* m_time;
};

MoveToThread类ThreadGoto.cpp

ThreadGoto::ThreadGoto(QObject *parent) : QObject(parent)
{
    m_thead = new QThread();

    this->moveToThread(m_thead);
    connect(m_thead,SIGNAL(started()),this,SLOT(ThreadRun()));
    m_thead->start();

    m_time = new QTimer();
    connect(m_time,SIGNAL(timeout()),this,SLOT(__onTimeOut()));
    m_time->start(1000);
}


void ThreadGoto::ThreadRun()
{
    qDebug() << "ThreadGoto -  ThreadRun - Thread-ID: " << QThread::currentThreadId();
}

void ThreadGoto::__onTimeOut()
{
    qDebug() << "ThreadGoto -  __onTimeOut - Thread-ID: " << QThread::currentThreadId();
}

运行结果:
MoveToThread运行结果

QThread与MoveToThread的区别

结果对比:
(1)定时器在继承QThread方法里的重新run函数里运行,所打印出来的线程号Thread-ID:0xXXXXXXXXX740同主线程0xXXXXXXXXX740
(2)定时器在MoveToThread的方法里,无论定时器在ThreadRun()创建还是在构造函数里创建。打印出来的线程号Thread-ID:0xXXXXXXXXX700同创建出来的线程Thread-ID:0xXXXXXXXXX700

结论:
继承QThread的方法只有重写run函数里的内容在子线程里运行,其他部分比如定时器的槽函数在主线程里运行。
MoveToThread的方法,所有的槽函数都在子线程里运行
详解见下链接:
QThread与MoveToThread的区别详解

评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值