Qt的多线程实现可分为两种实现方法,其一为继承QThread,并重写其run函数以实现多线程,而另一种则是本文将介绍的moveToThread,即将继承QObject中的类通过moveToThread函数来转移至一个Thread中以实现多线程。
代码说明
首先先自定义一个类Threadwork继承QObject,并在类中定义一个让子线程来实现的函数thread:
class Threadwork : public QObject
{
Q_OBJECT
public:
Threadwork();
public slots:
void thread();
};
之后就可以在Threadwork.c中去查看相应的构造函数以及成员函数的线程Id:
Threadwork::Threadwork()
{
qDebug()<<"主线程:"<<QThread::currentThreadId();
}
void Threadwork::thread()
{
qDebug()<<"子线程:"<<QThread::currentThreadId();
}
在mainwindow.h中定义了相关信号以及变量
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
explicit MainWindow(QWidget *parent = nullptr);
~MainWindow();
signals:
void work();
private:
Ui::MainWindow *ui;
QThread *SonThread;
Threadwork *MainThread;
};
最后就可以在mainwindow.c中实现多线程的使用。构建信号与槽函数,使用moveToThread构建子线程。
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
ChildThread= new QThread;
MainThread = new Threadwork;
connect(this,SIGNAL(work()),MainThread,SLOT(thread()));
MainThread -> moveToThread(ChildThread);
ChildThread-> start();
emit work();
}
最终显示出子线程确实与主线程不在同一线程。