Qt知识笔记(九)—— 多线程

Qt知识笔记(九)—— 多线程

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();
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值