通过试验我们发现,即使槽函数是定义在线程类中,调用函数的却不是这个线程。当然这不是我们希望的,有什么办法让调用槽函数的线程是本线程吗?
在 QT 中我们应该要知道几个问题。
- 对象依附于哪个线程
- 对象的依附性与槽函数执行的关系
- 对象的依附性是否可以改变,如何改变
默认情况下,对象依附于自身被创建的线程。
从代码中发现,是主线程创建了 ThreadTest threada; 和 MyClass my;这两个对象,那么这两个对象就依附于主线程了
默认情况下,槽函数在对象所依附的线程中执行。
对象的依附性确实可以改变,从源码中我们可以找到这样一个玩意。
//在 QObject 中
void moveToThread(QThread *thread);
该方法定义在了 QObject 中,通过这个方法可以改变对象的依附性。
试一下
#include <QApplication>
#include <QObject>
#include <QDebug>
#include <QThread>
class MyClass : public QObject
{
Q_OBJECT
public:
explicit MyClass(QObject *parent = nullptr){
}
public slots:
void getstarted()
{
qDebug()<<objectName()<<":"<<"getstarted() , tid :"<<QThread::currentThreadId();
}
void getfinished()
{