首页 > 其他分享 >qt 线程的创建和退出

qt 线程的创建和退出

时间:2022-09-23 10:36:39浏览次数:79  
标签:Thread2Work qt 创建 void Thread1Work 线程 include MainWindow

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 }

 

标签:Thread2Work,qt,创建,void,Thread1Work,线程,include,MainWindow
From: https://www.cnblogs.com/warmlight/p/16721837.html

相关文章

  • 【C++入门】(一)创建基本类
    1.类型是是什么?类型是一个包含数据和功能的对象 2.什么是类和对象?C++类是一个模板,用于创建对象。类是一系列捆绑在一起的变量和函数,变量构成了类的数据,......
  • 对多线程原子性的理解
    多线程原子性的理解:一个操作要么全部执行完毕,不会受到干扰而被中断;要么全都不执行。对于多线程中操作共享变量的操作,要保证它的原子性。在一个类中有共享变量count,开启......
  • 一种简单的springboot启动后启动一条死循环线程方式
    前言之前有测试#启动类加@EnableAsync#方法上加@Async@PostConstruct但是依旧会卡主主线程,所有另辟蹊径在启动类上加@EnableAsync新建一个类,实现Applicatio......
  • oracle 创建表空间
    oracle创建表空间oracle创建表空间可能很多人并不是很了解,下面就来简单介绍一下,主要是分为四步的,每一步的代码一定要认真研究,这样才能保证正确创建。 ......
  • JAVA 绑定线程到指定CPU上
    CPU个数、核数、线程数、JAVA多线程关系cpu个数、核数、线程数的关系cpu个数:是指物理上,也及硬件上的核心数;核数:是逻辑上的,简单理解为逻辑上模拟出的核心数;线程数:是同一......
  • JUC在深入面试题——三种方式实现线程等待和唤醒(wait/notify,await/signal,LockSupport
    一、前言在多线程的场景下,我们会经常使用加锁,来保证线程安全。如果锁用的不好,就会陷入死锁,我们以前可以使用Object的wait/notify来解决死锁问题。也可以使用Condition的aw......
  • 利用强类型数据集创建数据库访问层
    创建数据访问层项目2021/10/20 本文档是 VisualC# 教程  (切换到VisualBasic教程)该教程从头开始使用TypedDataSet(强类型DataSet)创建数据访问层(D......
  • 【Azure 应用服务】如果发现当前使用的订阅无法在China North 3 区中无法创建App Ser
    问题描述在创建AppService服务时,突然发现无法选择ChinaNorth3区域,如何来解决这个问题呢? 问题解答根据Azure中服务都需要在订阅中注册的原理,因为ChinaNorth3区域......
  • Day8 多线程基础概念的学习
    Day8多线程学习多线程多任务任务就是需要完成的一件事,多任务可能在同一时间解决,或者按步一个一个解决。通过多条道路解决原来一条道路堵塞的问题,多线程。就是同一时......
  • 【Git学习】基于特定提交编号创建新分支
    最近遇到需要拉取以前旧版本源码进行开发的情况,特此记录以作备忘。Tip:需要安装git客户端。http://git.repo/WPF/ThridPartPlugins.git1.2.109buildc397eeaa2019......