想要看的了解更多的,路径:Qt中多线程的使用 | 爱编程的大丙。这里我简单的记录一下。
1、继承QThread类
第一步:创建类继承QThread,并重写run方法
在run里面写运行的逻辑
class pthreadTst : public QThread
{
Q_OBJECT
public:
explicit pthreadTst(QObject *parent = nullptr);
protected:
void run();
signals:
// 自定义信号, 传递数据
void XXX(int num);
public slots:
};
第二步:在主线程中创建子线程,并启动
pthreadTst* subThread = new pthreadTst;
subThread->start();
为什么运行start()而不是run()?
这是因为在QThread
的设计中,run()
方法是在新线程中运行的,而start()
方法则是在主线程中启动新线程的函数。
调用start()
方法会执行以下步骤:
- 创建一个新的线程。
- 在新线程中执行
run()
方法。 - 将新线程和
QThread
对象进行关联,使得QThread
对象能够管理新线程的生命周期。
2、将对象移动到子线程中运行
第一步:创建一个类继承QObject,并使用public写对应的逻辑
class MyWork : public QObject
{
Q_OBJECT
public:
explicit MyWork(QObject *parent = nullptr);
// 工作函数
void working();
signals:
void curNumber(int num);
public slots:
};
第二步:在主线程中创建子线程和类对象,将对象移动到子线程里面去
QThread* sub = new QThread;
//MyWork* work = new MyWork(this); //千万不要指定给创建的对象指定父对象
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);
});