Qt多线程——四种实现多线程的方法
字数统计:186 阅读时长 ≈ 1分钟under Qt tag Published on June 22nd , 2020 at 03:56 am
一、前言
Qt中有两种实现多线程的方式:
- 继承
QThread
,然后重写run
函数实现多线程 - 继承
QObject
,使用moveToThread
函数实现多线程 - 使用
QThreadPool
线程池,搭配QRunnable
- 使用
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