1、Qt线程(二):继承QThread,重写run

article/2025/10/16 8:41:56

一、功能说明

1、通过继承QThread,重写run的方式实现多线程

2、点击“开始”按钮启动子线程,同时通过信号槽的方式给子线程发送“开始”字符串;

3、子线程每隔1秒向主线程发送累加数;

4、点击"停止"按钮,通过函数调用的方式停止子线程;

二、项目创建

1、新建Qt Widgets应用,名称为ThreadRun,基类选择QMainWindow;

2、MainWindow.ui中放入两个Push Button按钮,第一个text改为“开始”,objectNme改为startButton,第二个text改为“停止”,objectNme改为stopButton;

3、添加新的C++类,名称为MyThread,基类设置为QThread

三、代码演示

1、MainWindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H#include <QMainWindow>
#include "MyThread.h"namespace Ui {
class MainWindow;
}class MainWindow : public QMainWindow
{Q_OBJECTpublic:explicit MainWindow(QWidget *parent = nullptr);~MainWindow();signals:void sendData(QString);private slots:void on_startButton_clicked();void on_stopButton_clicked();void doSendValue(int);private:Ui::MainWindow *ui;MyThread *m_myThread;
};#endif // MAINWINDOW_H

 2、MainWindow.cpp

#include "MainWindow.h"
#include "ui_MainWindow.h"
#include <QDebug>
MainWindow::MainWindow(QWidget *parent) :QMainWindow(parent),ui(new Ui::MainWindow)
{ui->setupUi(this);qDebug() << "主线程id:" << QThread::currentThreadId();m_myThread = new MyThread(this);//接收子线程数据connect(m_myThread, &MyThread::sendValue, this, &MainWindow::doSendValue);//给子线程发送数据connect(this, &MainWindow::sendData, m_myThread, &MyThread::doSendData);ui->startButton->setEnabled(true);ui->stopButton->setEnabled(false);
}MainWindow::~MainWindow()
{if(m_myThread->isRunning()){m_myThread->stop();}m_myThread->quit(); //将子线程停止m_myThread->wait(); //等待子线程的运行结束后再停止delete ui;
}void MainWindow::on_startButton_clicked()
{emit sendData("开始");qDebug() << "主线程 startButtonid:" << QThread::currentThreadId();m_myThread->start(); //子线程开始,自动调用run()函数ui->startButton->setEnabled(false);ui->stopButton->setEnabled(true);
}void MainWindow::on_stopButton_clicked()
{qDebug() << "主线程 stopButtonid:" << QThread::currentThreadId();if(m_myThread->isRunning()){m_myThread->stop();ui->startButton->setEnabled(true);ui->stopButton->setEnabled(false);}}void MainWindow::doSendValue(int value)
{qDebug() << value << "doSendValue 线程id:"<< QThread::currentThreadId();
}

3、MyThread.h

#ifndef MYTHREAD_H
#define MYTHREAD_H#include <QObject>
#include <QThread>
class MyThread : public QThread
{Q_OBJECT
public:explicit MyThread(QObject *parent = nullptr);public slots:void stop();void doSendData(QString);protected:void run();signals:void sendValue(int);private slots:void showValue();private:volatile bool stopped;int value;
};#endif // MYTHREAD_H

4、MyThread.cpp

#include "MyThread.h"
#include <QThread>
#include <QDebug>MyThread::MyThread(QObject *parent) : QThread (parent)
{stopped = false;qDebug() << "创建 子线程id:" << QThread::currentThreadId();
}void MyThread::stop()
{stopped = true;qDebug() << "stop 子线程id:" << QThread::currentThreadId();
}void MyThread::doSendData(QString str)
{qDebug() << str << "doSendData 子线程id:" << QThread::currentThreadId();
}void MyThread::run()
{value = 0;qDebug() << "run 子线程id:" << QThread::currentThreadId();while(!stopped){showValue();msleep(1000);  //延迟1秒      }stopped = false;
}void MyThread::showValue()
{qDebug() << value << "show子线程id:"<< QThread::currentThreadId();emit sendValue(value); //数据发送给主线程value++;
}

5、其他不用更改

四、运行测试

1、Ctrl+R 运行

2、点击“开始”,2/3秒后点击停止,输出框显示如下:

3、注:

①子线程构造函数、被主线程调用的函数(stop())和信号槽方式调用的函数(doSendData())都是在主线程

②只有run()和run()调用的函数showValue()在子线程


http://chatgpt.dhexx.cn/article/oZC2r7AJ.shtml

相关文章

诡异的RunOnce病毒启动项和神奇的URL Protocol

整理磁盘发现之前有个有趣的流氓招数忘记分享了,每次看到新鲜的东东都感慨黑暗势力的层出不穷的招数,比某些安全厂商是不是自相残杀好多了.电脑日常使用过程中我们经常输入开头为http ftp,点击诸如ed2k的链接,每个链接的背后都会执行相应的功能.如http 通过iexplore.exe,ed2k通…

如何创建水晶报表

开发工具与关键技术&#xff1a;VS与MVC 作者&#xff1a;刘华叶 撰写时间&#xff1a;2019年4月29日 MVC是软件工程中的一种软件架构模式&#xff0c;涉及到的知识点也是相当广泛&#xff0c;而我们在做项目的过程中&#xff0c;总会遇到要制作一些报表&#xff0c;水晶报表就…

java 水晶报表教程_水晶报表 (Crystal Reports 2008)的配置

概要&#xff1a; Crystal Reports(水晶报表)是一款商务智能(BI)软件&#xff0c;主要用于设计及产生报表。水晶报表是业内最专业、功能最强的报表系统&#xff0c;它除了强大的报表功能外。最大的优势是实现了与绝大多数流行开发工具的集成和接口。在VS.Net平台做过报表开发的…

水晶报表教程:手把手教你制作基本报表

ASP.NET水晶报表的学习 这篇文章教你如何在.Net Web应用中使用水晶报表&#xff0c;也可以让你在学习过程中少走一些弯路。为了得到最好的效果&#xff0c;读者最好需要有一些基础的Asp.Net访问数据库的知识以及使用VS.Net的开发经验。 简介 水晶报表可以由很多的方法得到&a…

水晶报表基本使用方法

开发工具与关键技术&#xff1a;VS/MVC 作者&#xff1a;何桂朋 撰写时间&#xff1a;2019年4月22日 Crystal Reports&#xff08;水晶报表&#xff09;是一款商务智能&#xff08;BI&#xff09;软件&#xff0c;主要用于设计及产生报表。水晶报表是业内最专业、功能最强的报…

php try catch 不处理,如何解决php try catch不起作用的问题

如何解决php try catch不起作用的问题 发布时间&#xff1a;2020-09-22 09:59:14 来源&#xff1a;亿速云 阅读&#xff1a;103 作者&#xff1a;小新 这篇文章主要介绍了如何解决php try catch不起作用的问题&#xff0c;具有一定借鉴价值&#xff0c;需要的朋友可以参考下。希…

try catch执行过程分析

本篇文章带大家聊聊try catch的执行过程&#xff0c;有时候在开发的过程中&#xff0c;try代码里如果出现异常&#xff0c;catch后的步骤还会继续执行吗&#xff1f;以及finally的使用。 下面来分析一下几种使用场景&#xff1a; 场景一&#xff1a; try代码块中出现异常后&a…

面试官问我 ,try catch 应该在for循环里面还是外面?

前言 有个老哥昨天被面试官欺负了&#xff0c;但是是被这个问题&#xff08;标题&#xff09;欺负的&#xff1f; 其实是个比较基础的问题&#xff0c;只要有了解过&#xff0c;叙述是非常简单OK的。 只要有初学者觉得有疑惑&#xff0c;那么我相信不止是他一个。 所以&#…

try catch异常捕获

这次我们介绍try catch异常捕获。下面是try catch的语法。 thy catch 的作用就是异常捕获&#xff0c;在一些会报错的地方时的时候才会用到。 例如这个代码&#xff0c;当我们在控制器时输入的不是数字而是其他的文字或者其他符号呢&#xff1f;所以这里程序就会报错&#xff0…

try catch 的作用

不加try catch package com.web; public class Test25 {public static void main(String[] args) {int i 1 / 0;System.out.println("i " i);System.out.println("aaaa");//直接不运行了} }加try catch package com.web;public class Test25 {public …

kotlin try catch使用方法

5 kotlin之 try catch kotlin的try catch比Java更简洁面料采用,使用更方便 val value "10a"var out: Int? null//错误处理try {out Integer.parseInt(value)} catch (e: NumberFormatException) {println("NumberFormatException")println(e.message)…

try catch的作用

try catch的作用&#xff1a;当程序发生错误时&#xff0c;能够保证程序继续执行下去。 用一个简单例子说明&#xff1a; 1:无try catch public static void main(String[] args) { int i; i 2/0; System.out.println(i); System.out.println(1111111111); } 运行结果&…

try catch finally

结论&#xff1a; 1、不管有木有出现异常&#xff0c;finally块中代码都会执行&#xff1b; 2、当try和catch中有return时&#xff0c;finally仍然会执行&#xff1b; 3、finally是在return后面的表达式运算后执行的&#xff08;此时并没有返回运算后的值&#xff0c;而是先把要…

try catch 嵌套

实践测试 在单元测试中写入以下方法: testMain()主方法, out()里面嵌套了两层try catch 异常代码写在内层try中 示例一&#xff1a; Testpublic void testMain(){out();log.info("后续处理业务");}public void out(){//外层trytry {System.out.println("外层输…

try和catch的用法

try 和 catch 是用于处理异常的语句&#xff0c;它们构成了一种异常处理机制。在一个 try 语句中&#xff0c;程序执行一段代码&#xff0c;如果发生了异常&#xff0c;则会被捕获&#xff0c;并转到相应的 catch 语句中进行处理。 例如&#xff0c;在下面的代码中&#xff0c…

try-catch的使用以及细节

文章目录 try-catch的使用以及细节1. 基本语法2. 注意细节快捷键 try-catch的使用以及细节 &#x1f388; Java中提供 try 和catch块来处理异常。try块用于包含可能出错的代码。catch块用于处理try块中发生的异常。可以根据需要在程序中有多个try…catch块。 1. 基本语法 try{…

【小波变换】wavedecn方法

wavedecn wavedecn(data, wavelet, modesymmetric, levelNone, axesNone)Multilevel nD Discrete Wavelet Transform.Parameters----------data : ndarraynD input data# 可通过设置axes参数&#xff0c;来确定小波变化的维度axes : sequence of ints, optionalAxes over which…

Wave Engine 3.1 Released

Wave Engine最近发布了3.1版。 Wave Engine是一款完全免费的3D游戏引擎&#xff0c;能够针对大多数平台和XR设备。该版本带来了对.NET 5和C&#xff03;9的支持以及图形上的改进。 我们很高兴地宣布&#xff0c;与Microsoft合作&#xff0c;我们刚刚发布了WaveEngine 3.1&…

小波变换——提取图像(低频/宏观)到(高频/微观)信息

对我来说&#xff0c;小波分解属于研究大结构框架中图像预处理最基础的地方&#xff0c;由于创新性不足&#xff0c;一年多前尝试过以后就被搁置&#xff1b;现已研究出较新的多尺度/多分辨率特征提取算法&#xff0c;故将小波变换留个纪念。 import cv2 import numpy as np i…

Waves插件

Waves插件 下载安装包查看是否存在之前版本的waves 用控制面板或者其他软件 卸载 去控制面板中&#xff0c;正常缷掉WAVES 9安装目录&#xff0c;把残留的WAVES文件夹干掉&#xff01;清理注册表内的内容&#xff1a; 32bit : HKEY_LOCAL_MACHINE\Software\Waves 64bit : HKE…