【Qt】多线程示例代码(QThread)

news2024/11/24 10:44:20

从QThread继承方式

1. qdicethread.h

#ifndef QDICETHREAD_H
#define QDICETHREAD_H

#include <QObject>
#include <QThread>

class QDiceThread : public QThread
{
    Q_OBJECT
public:
    explicit QDiceThread(QThread *parent = nullptr);
    void diceBegin();
    void dicePause();
    void stopThread();

private:
    int m_seq = 0;
    int m_diceValue;
    bool m_Paused = true;
    bool m_stop = false;

    // QThread interface
protected:
    virtual void run() override;

signals:
    void newValue(int seq, int diceValue);


};

#endif // QDICETHREAD_H

2. qdicethread.cpp

#include "qdicethread.h"
#include <QTime>

QDiceThread::QDiceThread(QThread *parent)
    : QThread{parent}
{

}

void QDiceThread::diceBegin()
{
    //开始掷骰子
    m_Paused = false;
}

void QDiceThread::dicePause()
{
    //暂停掷骰子
    m_Paused = true;
}

void QDiceThread::stopThread()
{
    //停止线程
    m_stop = true;
}

void QDiceThread::run()
{
    //线程任务
    m_stop = false;
    m_seq = 0;

    //随机数初始化,qsrand是线程安全的
    qsrand(QTime::currentTime().msec());

    //循环主体
    while(!m_stop)
    {
        if(!m_Paused)
        {
            m_diceValue = qrand();
            m_diceValue = (m_diceValue % 6) + 1;
            m_seq++;

            //发送信号
            emit newValue(m_seq, m_diceValue);
        }

        //现场休眠500ms
        msleep(500);
    }

    //相当与exit(0), 退出线程的事件循环
    quit();
}





3. dialog.h

#ifndef DIALOG_H
#define DIALOG_H

#include <QWidget>
#include <QDialog>
#include "qdicethread.h"

QT_BEGIN_NAMESPACE
namespace Ui { class Dialog; }
QT_END_NAMESPACE

class Dialog : public QDialog
{
    Q_OBJECT

public:
    Dialog(QWidget *parent = nullptr);
    ~Dialog();

private:
    Ui::Dialog *ui;

private:
    QDiceThread threadA;

protected:
    virtual void closeEvent(QCloseEvent *event) override;

private slots:
    void onThreadA_started();
    void onThreadA_finished();
    void onThreadA_newValue(int seq, int diceValue);
    void on_pushButton_startThread_clicked();
    void on_pushButton_stopThread_clicked();
    void on_pushButton_start_clicked();
    void on_pushButton_pause_clicked();
    void on_pushButton_clear_clicked();
};
#endif // DIALOG_H

4. dialog.cpp

#include "dialog.h"
#include "ui_dialog.h"
#include <QCloseEvent>

Dialog::Dialog(QWidget *parent)
    : QDialog(parent)
    , ui(new Ui::Dialog)
{
    ui->setupUi(this);

    //信号连接
    connect(&threadA, SIGNAL(started()), this, SLOT(onThreadA_started()));
    connect(&threadA, SIGNAL(finished()), this, SLOT(onThreadA_finished()));
    connect(&threadA, SIGNAL(newValue(int, int)), this, SLOT(onThreadA_newValue(int, int)));
}

Dialog::~Dialog()
{
}

void Dialog::closeEvent(QCloseEvent *event)
{
    //窗口关闭事件,必须结束线程
    if(threadA.isRunning())
    {
        threadA.stopThread();
        threadA.wait();
    }
    event->accept();
}

void Dialog::onThreadA_started()
{
    //状态
    ui->label_status->setText("Thread状态: thread started");
}

void Dialog::onThreadA_finished()
{
    //状态
    ui->label_status->setText("Thread状态: thread finished");
}

void Dialog::onThreadA_newValue(int seq, int diceValue)
{
    QString str = QString::asprintf("第 %d 次掷骰子,点数为: %d\r\n", seq, diceValue);
    ui->textEdit->append(str);

    ui->label_num->setText(QString("%1").arg(diceValue));
}


void Dialog::on_pushButton_startThread_clicked()
{
    //启动线程
    threadA.start();

    ui->pushButton_start->setEnabled(false);
    ui->pushButton_stopThread->setEnabled(true);
    ui->pushButton_start->setEnabled(true);
    ui->pushButton_pause->setEnabled(false);
}


void Dialog::on_pushButton_stopThread_clicked()
{
    //结束线程
    threadA.stopThread();
    threadA.wait();

    ui->pushButton_start->setEnabled(true);
    ui->pushButton_stopThread->setEnabled(false);
    ui->pushButton_start->setEnabled(false);
    ui->pushButton_pause->setEnabled(false);
}


void Dialog::on_pushButton_start_clicked()
{
    //开始掷骰子
    threadA.diceBegin();

    ui->pushButton_start->setEnabled(false);
    ui->pushButton_pause->setEnabled(true);
}


void Dialog::on_pushButton_pause_clicked()
{
    //暂停掷骰子
    threadA.dicePause();

    ui->pushButton_start->setEnabled(true);
    ui->pushButton_pause->setEnabled(false);
}


void Dialog::on_pushButton_clear_clicked()
{
    ui->textEdit->clear();
}


5. 效果

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1965890.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

公交信息在线查询小程序的设计

管理员账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0c;用户管理&#xff0c;线路信息管理&#xff0c;站点分类管理&#xff0c;站点信息管理&#xff0c;周边分类管理周边信息管理&#xff0c;系统管理 微信端账号功能包括&#xff1a;系统首页&#xff0…

数说故事 | 大数据洞察宠物消费市场数据

“班味”越来越重的年轻人正靠养宠物来“拯救”自己的生活。结束了一天的忙碌&#xff0c;推开家门&#xff0c;撸个猫、遛个狗&#xff0c;哪怕云吸一下&#xff0c;命就续上了&#xff0c;感觉瞬间焕发新生&#xff0c;能量值满满。 宠物对于铲屎官的意义&#xff0c;不止于…

软件统一过程(RUP)

软件统一过程(Rational Unifed Process&#xff0c;RUP)是 Rational 软件公司创造的软件工程方法。RUP 描述了如何有效地利用商业的、可靠的方法开发和部署软件&#xff0c;是一种重量级过程。 1. 统一过程概述 统一过程 统一过程&#xff08;RUP/UP&#xff0c;Rational Unif…

openEuler Repo

openEuler repo 前言 一键创建在线repo&#xff0c;脚本自动识辨系统无须更改&#xff0c;默认脚本走的是华为更改变量即可$repo_url即可。 openEuler Repo 一键更改脚本 兼容一键替换openEuler repo 20 21 22 23 24自动识辨清华大学 openEuler repo华为云源 openEuler repo…

2024.7.31(基于域名和IP地址的主机,上线商城)

将原有的nginx.conf文件备份 [roottomcat ~]# cp /usr/local/nginx/conf/nginx.conf /usr/local/nginx/conf/nginx.conf.bak [roottomcat ~]# grep -Ev "#|^$" /usr/local/nginx/conf/nginx.conf > /usr/local/nginx/conf/nginx.conf 一、基于域名的虚拟主机 创建…

C语言程序设计18

程序设计18 问题18_1代码18_1结果18_1 问题18_2代码18_2结果18_2 问题18_3代码18_3结果18_3 问题18_1 函数 f u n fun fun 的功能是&#xff1a;有 N N N\times N NN 的矩阵&#xff0c;根据给定的 m ( m < N ) m(m<N) m(m<N) 值&#xff0c;将每行元素中的值均右…

Spring Boot 使用 Spring AI 构建知识库服务

目录 前言 环境准备 JDK17 Spring Boot 3.2.4 Ollama PostgreSQL16 下载向量化模型 pom yml EmbeddingController 向量化示例 向量化文本 向量化检索 ChatController 知识库示例 前言 做 AI 大模型技术调研时&#xff0c;参考的开源项目 Maxkb&#xff0c;它基于…

数据结构7月31日作业

问题&#xff1a; 答案&#xff1a;

C语言 ——深入理解指针(1)

目录 1. 内存和地址2. 指针变量和地址2.1 取地址操作符&#xff08;&&#xff09;2.2 指针变量和解引用操作符&#xff08;*&#xff09;2.3 指针变量的大小 3. 指针变量类型的意义3.1 指针的解引用3.2 指针 - 整数3.3 void* 指针 4. const修饰指针4.1 const修饰变量4.2 co…

Flink 实时数仓(二)【DIM 层搭建】

1、DIM 层搭建 1.1、设计要点 DIM层设计要点&#xff1a; DIM层存的是维度表&#xff08;环境信息&#xff0c;比如人、场、货等&#xff09;DIM层的数据存储在 HBase 表中DIM层表名的命名规范为dim_表名 DIM 层表是用于维度关联的&#xff0c;要通过主键&#xff08;维度外…

Chapter 22 数据可视化——折线图

欢迎大家订阅【Python从入门到精通】专栏&#xff0c;一起探索Python的无限可能&#xff01; 文章目录 前言一、Pyecharts介绍二、安装Pyecharts三、全局配置项四、绘制折线图 前言 在大数据时代&#xff0c;数据可视化成为了分析和展示数据的重要手段。Pyecharts 是一个基于 …

微信小程序-获取手机号:HttpClientErrorException: 412 Precondition Failed: [no body]

问题&#xff1a; 412 异常就是你的请求参数获取请求头与服务器的不符&#xff0c;缺少请求体&#xff01; 我的问题&#xff1a; 我这里获取微信手机号的时候突然给我报错142&#xff0c;但是代码用的是原来的代码&#xff0c;换了一个框架就噶了&#xff01; 排查问题&am…

esp-07s 模块的WIFI 联网和MQTT AT指令测试,固件下载更新方法

安信可官网: https://docs.ai-thinker.com/start 一、wifi 联网测试指令 版本&#xff1a;AT version: 1.2.0.0 //1.重启模块 ATRST//2.设置当前 Wi-Fi 模式&#xff0c;不保存到 flash ATCWMODE_CUR1//3.设置 DHCP&#xff0c;不保存到 flash ATCWDHCP_CUR1,1//4.上电是否…

AIGC大模型产品经理高频面试大揭秘‼️

近期有十几个学生在面试大模型产品经理&#xff08;薪资还可以&#xff0c;详情见下图&#xff09;&#xff0c;根据他们面试&#xff08;包括1-4面&#xff09;中出现高频大于3次的问题汇总如下&#xff0c;一共32道题目&#xff08;有答案&#xff09;。 29.讲讲T5和Bart的区…

使用PhotoMaker V2产生明星香水广告照片

PhotoMaker V2 是一个令人兴奋的工具&#xff0c;可以帮助您快速生成逼真的个性化人物照片。您只需提供一张或几张面部照片以及一个文本提示&#xff0c;即可在几秒钟内获得定制的照片或绘画&#xff0c;无需进行额外的训练。这个模型还可以与其他基于 SDXL 的基础模型或其他 L…

干货 | 2024中国联通算力网络安全白皮书(免费下载)

本白皮书以国家整体安全观为指导&#xff0c;充分发挥网络安全现代产业链链长的主体支撑和融通带动作用&#xff0c;提出算力网络“新质安全、共链可信”的安全愿景和“构建开放融合内生免疫弹性健壮网安智治的一体化安全”的安全目标。从运营商开展网络建设和应用部署的角度出…

安全编程:Rust示例强密码策略

一、什么是强密码策略&#xff1f; 强密码策略是一套旨在提高账户安全性的规则和建议。以下是一些创建和使用强密码的关键策略&#xff1a; 长度&#xff1a;密码应至少包含8个字符&#xff0c;更长的密码通常更安全。 复杂性&#xff1a;使用大小写字母、数字和特殊字符的组合…

OAuth2的四种认证方式

文章目录 客户端认证grant_typeclient_credential授权码认证access_token密码认证grant_typepassword刷新token认证其他认证 OAuth2是目前流行的认证协议&#xff0c;主要包含四种认证方式&#xff1a;客户端认证、密码认证、授权码认证、刷新令牌认证。 客户端认证grant_typec…

SpringBoot项目打包成war包

1. 项目场景 使用SpringBoot 开发项目&#xff0c;由于内置了Tomcat&#xff0c;所以项目可以直接启动&#xff0c;部署到服务器的时候&#xff0c;直接打成 jar 包&#xff0c;就可以运行了。 有时需要把项目打包放入外置的 Tomcat 或者 TongWeb 中运行&#xff0c;就需要把…

【Golang 面试 - 进阶题】每日 3 题(九)

✍个人博客&#xff1a;Pandaconda-CSDN博客 &#x1f4e3;专栏地址&#xff1a;http://t.csdnimg.cn/UWz06 &#x1f4da;专栏简介&#xff1a;在这个专栏中&#xff0c;我将会分享 Golang 面试中常见的面试题给大家~ ❤️如果有收获的话&#xff0c;欢迎点赞&#x1f44d;收藏…