Qt 使用线程的方式

发布时间 2023-12-26 12:36:44作者: SusieSnail_SUN

有两种:

第一种:

1. 需要创建一个线程子类,继承 Qt 的线程类 QThread:

#include <QThread>

class MyThread : public QThread
{
   
};

2. 重写父类的 run()函数,子线程的业务逻辑就在该方法中编写;

 class MyThread : public QThread
{  

public:
    explicit MyThread(XXX    XXXXXX, QObject *parent = nullptr);

    ...
  
protected:
    void run() override;

     ...
}

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

MyThread * subThread = new MyThread (XXX );

4. 启动子线程

        subThread->start();

 start()   启动,run()函数运行;

默认的线程为项目的主线程,自己创建的为子线程;

子线程和主线程之间通过信号 和 槽 实现传输:

// 如:
signals:
    void ok (int cnt);
    void  error (const QString &error);
//-------------------------------------

emit error("等待中....!");

//---------------------------------------

  QObject::connect(MyThread, &MyThread::ok,  this, [=](){
    ......
});

 

第二种

1.  需要创建一个类,派生自 类 QObject:

#include <QObject>

class  MyObject: public QObject
{

}

2. 在 MyObject 类中添加公共的成员函数,可以是多个,这些成员函数就是需要的业务逻辑函数;

#include <QObject>

class MyObject: public QObject
{
    Q_OBJECT
public:
    explicit MyObject(QObject *parent = nullptr);

    // 
    void subAAAA(xxxx  xxxxx);
    // 
    void subBBBB(xxxx  xxxxx);

}

subAAAA, subBBBB 就是创建的公共函数
3. 在主线程里面创建Qt 提供的标准 QThread 类对象;
// 创建线程对象
    QThread* t = new QThread;

4.  在主线程里面创建 添加的 MyObject 类 对象

// 创建任务对象
    MyObject*  worker = new MyObject;

5. 将 worker 对应移动到子线程中,使用 moveToThread 函数

worker->moveToThread(t);  // 将worker 移动到 QThread* t  中执行

6.  将子线程和主线程之间通过信号 和 槽 实现传输:

7.  起送子线程,也就是自定义的  QThread* t;

 t->start();