Qt多线程——四种实现多线程的方法

under Qt  tag     Published on June 22nd , 2020 at 03:56 am

一、前言

Qt中有两种实现多线程的方式:

  1. 继承QThread,然后重写run函数实现多线程
  2. 继承QObject,使用moveToThread函数实现多线程
  3. 使用QThreadPool线程池,搭配QRunnable
  4. 使用QtConcurrent

官方推荐使用第二种方法实现多线程,本文记录如何使用moveToThread函数实现多线程的方法

二、实现步骤

1. 写一个需要用子线程运行的类thread,该类需要继承QObject

thread.h文件如下:
#ifndef THREAD_H
#define THREAD_H
 
#include <QObject>
 
class Thread :public QObject
{
    Q_OBJECT
public:
    Thread();
    ~thread();
    void Thread_Fun(void);
};
 
#endif // THREAD_H
thread.cpp文件如下:
#include "thread.h"
#include <QDebug>
Thread::Thread()
{
    qDebug()<<"Thread构造函数ID:"<<QThread::currentThreadId();
}
 
void Thread::Thread_Fun()
{
    qDebug()<<"子线程功能函数ID:"<<QThread::currentThreadId();
}

2. 在主线程申明一个QThread实例与子线程实例Thread

mainwindow.h文件如下:
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
 
#include <QMainWindow>
#include <QThread>
#include <QObject>
#include <QDebug>
#include "thread.h"
 
namespace Ui {
class MainWindow;
}
 
class MainWindow : public QMainWindow
{
    Q_OBJECT
 
public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();
 
signals:
    void ToThread(); // 信号
 
private:
    Ui::MainWindow *ui;
    QThread *Thread_Test;
    Thread *thread_class;
};
 
#endif // MAINWINDOW_H

3.mainwindow.cpp中,先实例化Thread_Test线程和thread_class类,然后连接这个信号与槽函数。并且把thread_class这个类推向子线程,并且打开子线程

#include "mainwindow.h"
#include "ui_mainwindow.h"
 
MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    Thread_Test = new QThread;
    thread_class = new Thread;
    connect(this,&MainWindow::ToThread,thread_class,&Thread::Thread_Fun);
    thread_class->moveToThread(Thread_Test);
    Thread_Test->start();
    emit ToThread();
}
 
MainWindow::~MainWindow()
{
    delete ui;
}

本文由simyng创作, 采用知识共享署名4.0 国际许可协议进行许可,转载前请务必署名
  文章最后更新时间为:June 21st , 2020 at 07:56 pm