目录
1、前言
目前Qt的多线程使用大部分分为2种,分别是重写run函数、使用moveToThread函数,本文使用的是第二种方案。仅供个人学习参考。
环境:windows + Qt5.12
2、使用方法
1)、修改.h文件,如下所示。代码中有相关注释
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include <QThread>
#include <QDebug>
#include <QString>
#include <stdio.h>
namespace Ui {
class MainWindow;
}
class My_thread : public QObject
{
Q_OBJECT
public slots:
void My_thread_work();
signals:
void finish_thread(QString str); //工作结束信号
};
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
explicit MainWindow(QWidget *parent = nullptr);
~MainWindow();
private slots:
void on_pushButton_clicked(bool checked);
void show_text(QString str);
private:
Ui::MainWindow *ui;
My_thread *My_one_thread;
QThread usethread; //声明一个线程
signals:
void start_thread(); //工作开始信号
};
#endif // MAINWINDOW_H
2)、修改.c文件,如下所示。代码中有相关注释
#include "mainwindow.h"
#include "ui_mainwindow.h"
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
My_one_thread = new My_thread;
My_one_thread->moveToThread(&usethread);
connect(&usethread, &QThread::finished, My_one_thread, &QObject::deleteLater); //该线程结束时销毁
connect(My_one_thread, &My_thread::finish_thread, this, &MainWindow::show_text); //第二个线程结束时发送信号,主线程再动作
connect(this, &MainWindow::start_thread, My_one_thread, &My_thread::My_thread_work); //主线程控制第二个线程工作
usethread.start();
}
MainWindow::~MainWindow()
{
usethread.quit();
usethread.wait();
delete ui;
}
void MainWindow::show_text(QString str)
{
QString main_thread_ID;
main_thread_ID.sprintf("main ID :%p \r\n", QThread::currentThread()); //获取主线程ID
ui->textEdit->setText(ui->textEdit->toPlainText().append(main_thread_ID)); //打印主线程ID
ui->textEdit->setText(ui->textEdit->toPlainText().append(str)); //打印第二个线程ID
}
void MainWindow::on_pushButton_clicked(bool checked)
{
emit start_thread(); //按钮控制第二个线程工作
}
/********第二个线程相关函数*********/
void My_thread::My_thread_work()
{
QString second_thread_ID;
second_thread_ID.sprintf("second ID :%p \r\n", QThread::currentThread());
emit finish_thread(second_thread_ID); //第二个线程发送工作结束信号
}
3)、运行结果
点击下方的start按钮,从运行界面中可以看出TEXT中打印的线程ID不同,说明多线程创建成功,因此将任务繁重的工作放在另外一个线程中是保证主线程工作稳定的方法之一。