QT多线程实现之moveToThread

主要步骤:实现一个类,包含子线程需要做的操作,在主线程中创建该类对象和一个线程对象,将新创建的类对象moveToThread,主线程和子线程通信使用QT的信号与槽实现

一、实现自定义的类,继承自QObject
1、引入头文件

#include 

2、新建类myTherad 类的构造函数参数为主线程传递来的子线程的相关参数,子线程与主线程通信的信号与槽,数据以结构体形式传递(通过QVariant间接实现)。

class myThread : public QObject
{
	Q_OBJECT
public:
	myThread(QString S_Username,int S_Password,int S_CurId);
	~myTHread();

private slots:
	void task_on_thread_started();

signals:
	void updateCurId(QVariant myThreadInfo);

private:
	QString Username;
	int Password;
	int CurId;
};

3、多线程之间传递结构体的方法之一:注册自定义的结构体
引入头文件 声明结构体 并注册

#include 
typedef struct m_ThreadInfo
{
	QString T_Username = "";
	int T_Password = 0;
	int T_CurId = 0;
}m_ThreadInfo;

Q_DECLARE_METATYPE(m_ThreadInfo)

//发送信号updateCurId 传递子线程的参数 结构体形式
m_ThreadInfo m;
m.T_Username = Username;
m.T_Password = Password;
m.T_CurId = CurId;

QVariant v;
v.setValue(m);
emit updateCurID(v);

二、主线程 创建子线程并moveToThread
1、引入头文件

#include 
#include "myThread.h"

2、在主线程绑定上面的updateCurId()信号 与主线程的处理槽函数

//子线程创建及初始化
myThread *mythread = new myThread(myS_Username,myS_Password,myS_CurId);
QThread *thread = new QThread;
mythread->moveToThread(thread);   **//关键!!!**
//绑定子线程开启处理槽
connect(thread,SIGNAL(started()),mythread,SLOT(task_on_thread_started()));
//绑定子线程发送的更新数据信号槽
connect(mythread,SIGNAL(updateCurId(QVariant)),this,SLOT(on_updateCurId(QVariant)));
//在此之前都是在主线程中执行的

thread->start();

3、主线程接收子线程发来的updateCurId(QVariant)信号的响应槽函数on_updateCurId(QVariant)实现

void MainWindow::on_updateCurID(QVariant myThreadInfo)
{
    m_ThreadInfo t = myThreadInfo.value<m_ThreadInfo>();
    qDebug() << "T_Username = " << t.T_Username;
    qDebug() << "T_Password = " << t.T_Password;
    qDebug() << "T_Cur_Id = " << t.T_Cur_Id;
}

你可能感兴趣的:(QT,多线程,qt)