Qt作为一个优秀的跨平台开发框架,对于多线程的支持必然要非常的优雅~本篇文章就来探讨如何利用Qt创建新的子线程。

关于多线程的有点我就不赘述了,如需了解,善用百度~

本文根据B站黑马程序员的课程,再加上自己的一丢丢理解而写的。

Qt4线程的创建与使用

在Qt4的时代(我莫得经历过,因为Qt4是十几年前发布的,其中的某些思想肯定跟不上目前的发展,但是Qt5依然兼容Qt4的多线程模式),如果我们想要创建一个线程,我们只需新建一个类MyThread并继承于QThread,并重写QThread类的虚函数void run()。当我们需要创建进程的时候,只需声明一个MyThread对象,然后调用MyThread::start()即开启了一个新线程。

例:

1
2
3
4
5
6
7
8
9
#include <QThread>

class MyThread: public QThread
{
public:
MyThread();
protected:
void run(); //重载父类虚函数
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
MyThread::MyThread()
{

}
void MyThread::run()
{
int i = 0;
while(true)
{
while(1)
{
qDebug()<<i++<<endl;
}
}

}
1
2
MyThread* thread = new MyThread();
thraed->start();

如何停止线程在后面讲解。

Qt5线程的创建与使用

来到Qt5时代,线程的调用不再是重新run函数,而是自定义一个继承于QObjectMyThread类,这个类需要一个线程数据处理方法和一个线程结束信号,具体定义流程如下:

  1. 创建一个MyThread对象,且这个对象不能指定父对象
  2. 创建一个QThread对象,即我们需要的子线程
  3. 将自定义类放进我们创建的子线程对象,即调用moveToThread(QThread *target)
  4. 启动子线程,即调用子线程对象的start()方法,这个时候子线程已经启动了,但是数据处理还没启动
  5. 必须必须利用信号槽的方式启动自定义类的对象的方法,否则数据处理方法就在主线程中运行

上例子,比文字描述更加清晰

1
2
3
4
5
6
7
8
9
10
#include <QThread>

class MyWork: public QObject
{
public:
MyWork();
void work(); //线程工作函数
signals:
void threadDone();//线程结束信号
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
MyWork::MyWork()
{

}
void MyWork::work()
{
int i = 0;
while(true)
{
while(1)
{
qDebug()<<i++<<endl;
}
}

}
1
2
3
4
5
6
7
//主线程cpp文件
connect(this,&MainWindow::startThread,)

QThread* thread = new QThread(this);
MyWork* myWork = new MyWork();
thraed->start();
emit startThread();

待续…

后话