Qt---线程的三种使用方法

1.

注意:

  • 默认的线程在Qt中称之为窗口线程,也叫主线程,负责窗口事件处理或者窗口控件数据的更新
  • 子线程负责后台的业务逻辑处理,子线程中不能对窗口对象做任何操作,这些事情需要交给窗口线程处理
  • 主线程和子线程之间如果要进行数据的传递,需要使用Qt中的信号槽机制

方法1:继承QThread

1.建一个线程类的子类,让其继承QT中的线程类 QThread

class MyThread:public QThread
{
    ......
}

2.重写父类的 run() 方法,在该函数内部编写子线程要处理的具体的业务流程

class MyThread:public QThread
{
    ......
 protected:
    void run()
    {
        ........
    }
}

3.主线程中创建子线程对象

MyThread * subThread = new MyThread;

4.启动子线程, 调用 start() 方法

//在外部调用start()相当于让run()开始运行
subThread->start();

当子线程别创建出来之后,父子线程之间的通信可以通过信号槽的方式,注意事项:

在Qt中在子线程中不能操作程序中的窗口类型对象,只有主线程才能操作程序中的窗口对象, 默认的线程就是主线程, 自己创建的就是子线程

方法2:使用QObject类提供的moveToThread()方法

1.创建一个新的类,让这个类从Object中派生

class MyWork:public QObject
{
    .......
}

2.在这个类中添加一个公共的成员函数,函数体就是需要在子线程中执行的业务逻辑

class MyWork:public QObject
{
public:
    .......
    // 函数名自定义, 参数可以根据实际需求添加
    void working();
}

3.在主线程中创建一个QThread,这个就是子线程的对象

QThread* sub = new QThread;

4.在主线程中创建工作的类对象(不能指定父对象)

MyWork* work = new MyWork(this);    // error
MyWork* work = new MyWork;          // ok

5.把工作类对象移动到创建的子线程对象中

// 提示: QObject::moveToThread: Cannot move objects with a parent
work->moveToThread(sub);	// 移动到子线程中工作

6.启动子线程,调用 start(), 这时候线程启动了, 但是移动到线程中的对象并没有工作

7.调用MyWork类对象的工作函数,让这个函数开始执行,这时候是在移动到的那个子线程中运行的

 qDebug() << "主线程对象的地址: " << QThread::currentThread();

    // 创建线程对象
    QThread* sub = new QThread;
    // 创建工作的类对象[不要指定给创建的对象指定父对象]
    // 如果指定了: QObject::moveToThread: Cannot move objects with a parent
    MyWork* work = new MyWork;
    // 将工作的类对象移动到创建的子线程对象中
    work->moveToThread(sub);
    // 启动线程
    sub->start();
    // 让工作的对象开始工作, 点击开始按钮, 开始工作
    connect(ui->startBtn, &QPushButton::clicked, work, &MyWork::working);
    // 显示数据
    connect(work, &MyWork::curNumber, this, [=](int num)
    {
        ui->label->setNum(num);
    });

方法三:线程池

  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值