QT 多线程编程之moveToThread测试
源码下载 :
https://download.csdn.net/download/xjzdr/15926823
1、创建一个Widget的项目:
项目名称:QTTcpSocketMulThread,主窗口名称:myWidget
在主窗口中添加一个按钮,mywidget.h文件:
private:
QThread *mySubthread;
myClass *myclass;
signals:
void ToThread(); // 信号
按钮的click函数中加入以下代码:
//连接按钮
void myWidget::on_pushButton_clicked()
{
qDebug()<<"主线程的线程ID:"<<QThread::currentThreadId();
mySubthread=new QThread;//线程实例化
qDebug()<<"mySubthread的线程ID:"<<mySubthread->currentThreadId();
myclass=new myClass;//类的实例化,myClass需要继承自QObject
connect(this,&myWidget::ToThread,myclass,&myClass::myFunc);//将ToThread信号与myFunc建立连接
myclass->moveToThread(mySubthread);//将myclass加到线程mySubthread中
mySubthread->start();
emit ToThread();//触发ToThread信息,即执行&myClass::myFunc函数
disconnect(this,&myWidget::ToThread,myclass,&myClass::myFunc);//断开ToThread信号与myFunc的连接
}
2、添加一个类,类名:myClass
myclass.h文件中:
myclass.h
myclass.cpp文件中:
myClass::myClass(QObject *parent) : QObject(parent)
{
qDebug()<<"myClass构造函数中输出的当前线程ID:"<<QThread::currentThreadId();
myFunc();
}
void myClass::myFunc()
{
qDebug()<<"myClass的函数myFunc中输出的当前线程ID:"<<QThread::currentThreadId();
}
3、运行结果及分析:
点击2次按钮,2次的输出进行对比如下:
对比结果如下:
1、通过信号触发的myFunc();。在每次触发时,会在不同的线程运行myFunc()。
2、构造函数中的myFunc();和主线程在同一个线程中
4、在myClass中再增加一个方法myFunc2();
void myClass::myFunc2() { qDebug()<<"myClass的函数myFunc2中输出的当前线程ID:"<<QThread::currentThreadId(); }
然后在myFunc中加一行代码,调用myFunc2
void myClass::myFunc() { myFunc2(); qDebug()<<"myClass的函数myFunc中输出的当前线程ID:"<<QThread::currentThreadId(); }
编译运行,然后点击2次按钮,结果如下:
第一次点击:
主线程的线程ID: 0x23d0
mySubthread的线程ID: 0x23d0
myClass构造函数中输出的当前线程ID: 0x23d0
myClass的函数myFunc2中输出的当前线程ID: 0x23d0
myClass的函数myFunc中输出的当前线程ID: 0x23d0
myClass的函数myFunc2中输出的当前线程ID: 0x2600
myClass的函数myFunc中输出的当前线程ID: 0x2600
第二次点击:
主线程的线程ID: 0x23d0
mySubthread的线程ID: 0x23d0
myClass构造函数中输出的当前线程ID: 0x23d0
myClass的函数myFunc2中输出的当前线程ID: 0x23d0
myClass的函数myFunc中输出的当前线程ID: 0x23d0
myClass的函数myFunc2中输出的当前线程ID: 0x2b50
myClass的函数myFunc中输出的当前线程ID: 0x2b50
结果分析:
可以看到,myFunc2的线程ID始终与myFunc是相同的。也就是说myFunc2运行在myFunc的线程里面。