QT 线程继承QTread与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运行结果:

(2)加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();
}
运行结果:

QThread与MoveToThread的区别
结果对比:
(1)定时器在继承QThread方法里的重新run函数里运行,所打印出来的线程号Thread-ID:0xXXXXXXXXX740同主线程0xXXXXXXXXX740
(2)定时器在MoveToThread的方法里,无论定时器在ThreadRun()创建还是在构造函数里创建。打印出来的线程号Thread-ID:0xXXXXXXXXX700同创建出来的线程Thread-ID:0xXXXXXXXXX700
结论:
继承QThread的方法只有重写run函数里的内容在子线程里运行,其他部分比如定时器的槽函数在主线程里运行。
MoveToThread的方法,所有的槽函数都在子线程里运行
详解见下链接:
QThread与MoveToThread的区别详解
400

被折叠的 条评论
为什么被折叠?



