Qt的多线程创建一般有两种方法,一是继承QThread并重写run()函数,二是继承QObject,利用信号槽调用相关函数。第一种方法,在新的线程中只能实现run()函数中的内容,而第二种可以通过movetothread()随意调用自己想用的方法,也可以只用一个类实现多个线程共同工作。
以下是代码:
WorkThread.h文件中代码如下
#ifndef WORKTHREAD_H
#define WORKTHREAD_H
#include <QObject>
#include<QDebug>
#include<QThread>
class WorkThread : public QObject
{
Q_OBJECT
public:
explicit WorkThread(QObject *parent = nullptr);
signals:
public slots:
void work1();
void work2();
void work3();
};
#endif // WORKTHREAD_H
WorkThread.cpp代码如下:
#include "workthread.h"
WorkThread::WorkThread(QObject *parent) : QObject(parent)
{
}
void WorkThread::work1()
{
qDebug() << QString::fromLocal8Bit("work1的线程为:") << QThread::currentThreadId();
}
void WorkThread::work2()
{
qDebug() << QString::fromLocal8Bit("work2的线程为:") << QThread::currentThreadId();
}
void WorkThread::work3()
{
qDebug() << QString::fromLocal8Bit("work3的线程为:") << QThread::currentThreadId();
}
MainWindow.h代码如下
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include<QThread>
#include"workthread.h"
namespace Ui {
class MainWindow;
}
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
explicit MainWindow(QWidget *parent = nullptr);
~MainWindow();
private:
Ui::MainWindow *ui;
WorkThread *work1;
WorkThread *work2;
WorkThread *work3;
QThread *thread1;
QThread *thread2;
QThread *thread3;
};
#endif // MAINWINDOW_H
MainWindow.cpp代码如下
#include "mainwindow.h"
#include "ui_mainwindow.h"
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow),
work1(nullptr),
work2(nullptr),
work3(nullptr)
{
ui->setupUi(this);
//三个工作对象
work1 = new WorkThread;
work2 = new WorkThread;
work3 = new WorkThread;
//三个线程对象
thread1 = new QThread;
thread2 = new QThread;
thread3 = new QThread;
//移入线程
work1->moveToThread(thread1);
work2->moveToThread(thread2);
work3->moveToThread(thread3);
//线程开始工作
thread1->start();
thread2->start();
thread3->start();
//建立信号槽,work1、work2、work3分别为三个ui文件中的三个button
connect(ui->work1, &QPushButton::clicked, work1, &WorkThread::work1);
connect(ui->work2, &QPushButton::clicked, work2, &WorkThread::work2);
connect(ui->work3, &QPushButton::clicked, work3, &WorkThread::work3);
}
MainWindow::~MainWindow()
{
delete ui;
}
ui文件内容为
运行程序,分别点击三个按钮,得到如下输出
由此可见,同一个类中的三个槽函数分别在三个不同的线程中,而继承QThread重写run()函数的方法,只能运行在一个线程中。