qt 线程的创建和退出
qt常用的线程创建有两种方法,一种是继承QThread,重写run函数,一种是创建一个业务处理类,moveToThread。
我创建了一个widget工程,演示一下。
示例地址:https://files-cdn.cnblogs.com/files/warmlight/TestThread20220923.rar?t=1663900098
MainWindow.h:
1 #ifndef MAINWINDOW_H 2 #define MAINWINDOW_H 3 4 #include <QMainWindow> 5 #include "thread1work.h" 6 #include "thread2work.h" 7 8 namespace Ui { 9 class MainWindow; 10 } 11 12 class MainWindow : public QMainWindow 13 { 14 Q_OBJECT 15 16 public: 17 explicit MainWindow(QWidget *parent = nullptr); 18 ~MainWindow(); 19 20 private slots: 21 void on_btnStartThread1_clicked(); 22 23 void on_btnStartThread2_clicked(); 24 25 private: 26 Ui::MainWindow *ui; 27 28 QThread* m_thread1; 29 //QThread* m_thread2; 30 Thread1Work* m_thread1Work; 31 Thread2Work* m_thread2Work; 32 }; 33 34 #endif // MAINWINDOW_H
mainwindow.cpp
1 #include "mainwindow.h" 2 #include "ui_mainwindow.h" 3 #include <QDateTime> 4 #include <QDebug> 5 6 MainWindow::MainWindow(QWidget *parent) : 7 QMainWindow(parent), 8 ui(new Ui::MainWindow) 9 { 10 ui->setupUi(this); 11 } 12 13 MainWindow::~MainWindow() 14 { 15 delete ui; 16 } 17 18 void MainWindow::on_btnStartThread1_clicked() 19 { 20 if(ui->btnStartThread1->isChecked()){ 21 ui->btnStartThread1->setText("停止线程1"); 22 m_thread1Work = new Thread1Work(); 23 m_thread1 = new QThread(); 24 m_thread1Work->moveToThread(m_thread1); 25 connect(m_thread1, &QThread::started, m_thread1Work, &Thread1Work::DoWork);//线程开始执行业务处理 26 connect(m_thread1, &QThread::finished, m_thread1Work, &QObject::deleteLater);//线程结束释放工作类 27 connect(m_thread1, &QThread::finished, m_thread1, &QObject::deleteLater);//线程结束释放线程指针 28 m_thread1->start(); 29 } 30 else { 31 ui->btnStartThread1->setText("启动线程1"); 32 m_thread1Work->StopThread(); 33 34 m_thread1->exit(0);//退出线程 35 QDateTime startTime = QDateTime::currentDateTime(); 36 m_thread1->wait();//10秒 wait的参数是microsecond,即微妙 37 QDateTime endTime = QDateTime::currentDateTime(); 38 qint64 intervalMs = startTime.msecsTo(endTime); 39 qDebug() << intervalMs; 40 m_thread1 = nullptr; 41 m_thread1Work = nullptr; 42 } 43 44 } 45 46 void MainWindow::on_btnStartThread2_clicked() 47 { 48 if(ui->btnStartThread2->isChecked()){ 49 ui->btnStartThread2->setText("停止线程2"); 50 m_thread2Work = new Thread2Work(); 51 52 connect(m_thread2Work, &QThread::finished, m_thread2Work, &QObject::deleteLater);//线程结束释放线程类 53 m_thread2Work->start(); 54 } 55 else { 56 ui->btnStartThread2->setText("启动线程2"); 57 m_thread2Work->StopThread(); 58 59 m_thread2Work->quit();//退出线程 60 QDateTime startTime = QDateTime::currentDateTime(); 61 m_thread2Work->wait();//等待线程退出 62 QDateTime endTime = QDateTime::currentDateTime(); 63 qint64 intervalMs = startTime.msecsTo(endTime); 64 qDebug() << intervalMs; 65 m_thread2Work = nullptr; 66 } 67 }
Thread1Work.h
1 #ifndef THREAD1_H 2 #define THREAD1_H 3 4 #include <QObject> 5 #include <QThread> 6 7 class Thread1Work : public QObject 8 { 9 Q_OBJECT 10 public: 11 explicit Thread1Work(QObject *parent = nullptr); 12 13 public slots: 14 void StopThread(); 15 void DoWork(); 16 signals: 17 18 19 private: 20 bool m_bStop; 21 int m_nCount; 22 }; 23 24 #endif // THREAD1_H
Thread1Work.cpp
1 #include "thread1work.h" 2 #include <QDebug> 3 4 Thread1Work::Thread1Work(QObject *parent) : QObject(parent) 5 { 6 m_bStop = false; 7 m_nCount = 0; 8 } 9 10 void Thread1Work::StopThread() 11 { 12 m_bStop = true; 13 } 14 15 void Thread1Work::DoWork() 16 { 17 18 while (!m_bStop) { 19 char* p = new char[5000000]; 20 qInfo() << "Thread1---Thread-ID: " << QThread::currentThreadId() << " Count: " << m_nCount++; 21 QThread::msleep(100); 22 delete[] p; 23 p = nullptr; 24 25 } 26 qInfo() << "Thread1---Thread-ID: " << QThread::currentThreadId() << " Exit"; 27 }
Thread2Work.h
1 #ifndef THREAD2_H 2 #define THREAD2_H 3 4 #include <QThread> 5 6 class Thread2Work : public QThread 7 { 8 public: 9 Thread2Work(); 10 void StopThread(); 11 protected: 12 void run() override; 13 14 private: 15 bool m_bStop; 16 int m_nCount; 17 }; 18 19 #endif // THREAD2_H
Thread2Work.cpp
1 #include "thread2work.h" 2 #include <QDebug> 3 4 Thread2Work::Thread2Work() 5 { 6 m_bStop = false; 7 m_nCount = 0; 8 } 9 10 void Thread2Work::StopThread() 11 { 12 m_bStop = true; 13 } 14 15 void Thread2Work::run() 16 { 17 while (!m_bStop) { 18 qInfo() << "Thread2---Thread-ID: " << QThread::currentThreadId() << " Count: " << m_nCount++; 19 QThread::msleep(100); 20 } 21 qInfo() << "Thread2---Thread-ID: " << QThread::currentThreadId() << " Exit"; 22 }