QThread
Qt中有专门处理线程的类,即QThread
Qt中使用线程需要注意:
1.默认的线程在Qt中称之为窗口线程,也叫主线程,负责窗口事件处理或者窗口控件数据的更新
2.子线程负责后台的业务逻辑处理,子线程中不能对窗口对象做任何操作
3.主线程和子线程之间如果要进行数据的传递,需要使用Qt中的信号槽机制
QThread的API自行查阅Qt助手,这里介绍run()函数。run()是处理子线程的任务。
1.run() 是一个虚函数,写一个子类让其继承 QThread,在子类中重写父类的 run() 方法,函数体就是对应的任务处理流程,就可以让子线程执行。
2.run()是一个受保护的成员函数,不能够在类的外部调用,如果想要让线程执行这个函数中的业务流程,需要通过当前线程对象调用槽函数 start() 启动子线程,当子线程被启动,run() 函数也就在线程内部被调用了。
使用方法一
这种方法虽然简单的,但是有弊端。假设要在一个子线程中处理多个任务,所有的处理逻辑都需要写到run()函数中,这样函数中的处理逻辑就会变得非常混乱,不容易维护。
1.创建一个线程类的子类,继承QThread
class MyThread:public QThread
{
......
}
2.重写父类的 run () 方法,在该函数内部编写子线程要处理的具体的业务流程
class MyThread:public QThread
{
......
protected:
void run()
{
........
}
}
3.在主线程中创建子线程对象
MyThread * subThread = new MyThread;
4.启动子线程,调用 start () 方法
subThread->start();
使用方法二
1.创建一个新的类,让这个类从 QObject 派生
class MyWork:public QObject
{
.......
}
2.在这个类中添加一个公共的成员函数,函数体就是我们要子线程中执行的业务逻辑
class MyWork:public QObject
{
public:
.......
// 函数名自己指定,参数根据实际需求添加
void working();
}
3.在主线程中创建一个 QThread 对象,这就是子线程的对象
QThread* sub = new QThread;
4.在主线程中创建工作的类对象(不能指定给创建的对象指定父对象)
MyWork* work = new MyWork;
5.将 MyWork 对象移动到创建的子线程对象中,需要调用 QObject 类提供的 moveToThread() 方法
// 如果给work指定了父对象, 这个函数调用就失败了
work->moveToThread(sub); // 移动到子线程中工作
6.启动子线程,调用 start(), 这时候线程启动了,但是移动到线程中的对象并没有工作
sub->start();
7.调用 MyWork 类对象的工作函数,让这个函数开始执行,这时候是在移动到的那个子线程中运行的
work->working();