【嵌入式——QT】QThread创建多线程

【嵌入式——QT】QThread创建多线程

  • 概述
  • 主要函数
  • 图示
  • 代码示例

概述

QThread类提供不依赖于平台的管理线程的方法,一个QThread类的对象管理一个线程,一般从QThread继承一个自定义类,并重定义虚函数run(),在run()函数里实现线程需要完成的任务。
将应用程序的线程称为主线程,额外创建的线程称为工作线程,一般在主线程里创建工作线程,并调用start()开始执行工作线程的任务。start()会在内部调用run()函数,进入工作线程的时间循环,在run()函数调用exit()或quit()可以结束线程的事件循环,或在主线程里调用terminate()强制结束线程。

主要函数

信号

  • void finished():线程结束时发射此信号;
  • void started():线程开始执行、run()函数被调用之前发射此信号;

槽函数

  • quit():退出线程的事件循环,并返回代码0,等效于exit(0);

  • start(QThread::Priority priority = InheritPriority):内部调用run()开始执行线程,操作系统根据Priority参数进行调度;

  • terminate():终止线程的运行,但不是立即结束线程,而是等待操作系统结束线程,使用terminate()之后应使用wait();

    Priority

    • QThread::IdlePriority: 仅在没有其他线程运行时调度;
    • QThread::LowestPriority:比低优先级安排得更少;
    • QThread::LowPriority:比NormalPriority更少被安排;
    • QThread::NormalPriority:操作系统的默认优先级;
    • QThread::HighPriority:比NormalPriority更经常被安排;
    • QThread::HighestPriority:比高优先级安排得更频繁;
    • QThread::TimeCriticalPriority:尽可能多安排时间;
    • QThread::InheritPriority:使用与创建线程相同的优先级。这是默认值;

公共函数

  • bool isFinished() const:线程是否结束;
  • bool isRunning() const:线程是否正在运行;
  • priority() const:返回线程的优先级;
  • setPriority(QThread::Priority priority):设置线程的优先级;
  • exit(int returnCode = 0):退出线程的事件循环;
  • wait(unsigned long time):阻止线程执行,直到线程结束,或等待线程超过time毫秒;

静态公共函数

  • idealThreadCount():返回系统上能运行的线程的理想个数;
  • msleep(unsigned long msecs):强制当前线程休眠msecs毫秒;
  • sleep(unsigned long secs):强制当前线程休眠secs秒;
  • usleep(unsigned long usecs):强制当前线程休眠usecs微秒;

保护函数

  • int exec():由run()函数调用,进入线程的事件循环,等待exit退出;
  • virtual void run():start()调用run()函数开始线程任务的执行,所以在run()函数里实现线程的任务功能;

图示

在这里插入图片描述

代码示例

QDiceThread.h

#ifndef QDICETHREAD_H
#define QDICETHREAD_H

#include <QObject>
#include <QThread>
#include <QMutex>
class QDiceThread : public QThread
{
    Q_OBJECT

public:
    QDiceThread();
    ~QDiceThread();

    void run() Q_DECL_OVERRIDE;

    void diceBegin();//掷一次骰子
    void dicePause();//暂停
    void stopThread();//结束线程

    bool readValue(int* seq, int* diceValue);

signals:
    void newValue(int seq, int diceValue);//产生新点数的信号


private :
    int m_seq = 0;//掷骰子次数序号
    int m_diceValue;//骰子点数
    bool m_paused = true;//暂停
    bool m_stop = false;//停止

    QMutex mutex;

};

#endif // QDICETHREAD_H

QDiceThread.cpp

#include "QDiceThread.h"
#include <QTime>
#include <QMutexLocker>
QDiceThread::QDiceThread() {}

QDiceThread::~QDiceThread()
{
}

void QDiceThread::run()
{
    m_stop = false;
    m_seq = 0;
    qsrand(QTime::currentTime().msec());
    while(!m_stop) {
        if(!m_paused) {
            //QMutexLocker用法
            // QMutexLocker Locker(&mutex);
            //mutex用法
            mutex.lock();
            m_diceValue = qrand();
            m_diceValue = (m_diceValue % 6)+1;
            m_seq++;
            //使用互斥量读取数据,暂时注释掉信号操作
            // emit newValue(m_seq, m_diceValue);
            //mutex用法
            mutex.unlock();
        }
        msleep(500);
    }
    quit();
}

void QDiceThread::diceBegin()
{
    m_paused = false;
}

void QDiceThread::dicePause()
{
    m_paused = true;
}

void QDiceThread::stopThread()
{
    m_stop = true;
}

bool QDiceThread::readValue(int* seq, int* diceValue)
{
    if(mutex.tryLock()) {
        *seq = m_seq;
        *diceValue = m_diceValue;
        mutex.unlock();
        return true;
    } else {
        return false;
    }
}

QThreadDialog.h

#ifndef QTHREADDIALOG_H
#define QTHREADDIALOG_H

#include <QDialog>
#include "QDiceThread.h"
#include <QTimer>
namespace Ui
{
    class QThreadDialog;
}

class QThreadDialog : public QDialog
{
    Q_OBJECT

public:
    explicit QThreadDialog(QWidget* parent = nullptr);
    ~QThreadDialog();

    void closeEvent(QCloseEvent* event);

private slots:
    void on_pushButtonStart_clicked();

    void on_pushButtonPause_clicked();

    void on_pushButtonBegin_clicked();

    void on_pushButtonStop_clicked();

    void on_pushButtonClear_clicked();

public slots:
    void threadStatusStart();

    void threadStatusFinished();

    void threadNewValue(int seq, int diceValue);

    void onTimeOut();

private:
    Ui::QThreadDialog* ui;
    QDiceThread thread;

    QTimer timer;

    int mSeq, mDiceValue;
};

#endif // QTHREADDIALOG_H

QThreadDialog.cpp

#include "QThreadDialog.h"
#include "ui_QThreadDialog.h"

QThreadDialog::QThreadDialog(QWidget* parent)
    : QDialog(parent)
    , ui(new Ui::QThreadDialog)
{
    ui->setupUi(this);
    connect(&thread, SIGNAL(started()), this, SLOT(threadStatusStart()));
    connect(&thread, SIGNAL(finished()), this, SLOT(threadStatusFinished()));
    connect(&thread, &QDiceThread::newValue, this, &QThreadDialog::threadNewValue);
    connect(&timer, SIGNAL(timeout()), this, SLOT(onTimeOut()));
}

QThreadDialog::~QThreadDialog()
{
    delete ui;
}

void QThreadDialog::closeEvent(QCloseEvent* event)
{
    if(thread.isRunning()) {
        thread.stopThread();
        thread.wait();
    }
    event->accept();
}

void QThreadDialog::on_pushButtonStart_clicked()
{
    thread.start();
    mSeq = 0;
    ui->pushButtonStart->setEnabled(false);
    ui->pushButtonStop->setEnabled(true);
    ui->pushButtonBegin->setEnabled(true);
    ui->pushButtonPause->setEnabled(false);
}

void QThreadDialog::on_pushButtonStop_clicked()
{
    thread.stopThread();
    thread.wait();
    ui->pushButtonStart->setEnabled(true);
    ui->pushButtonStop->setEnabled(false);
    ui->pushButtonBegin->setEnabled(false);
    ui->pushButtonPause->setEnabled(false);
}


void QThreadDialog::on_pushButtonBegin_clicked()
{
    thread.diceBegin();
    timer.start(100);
    ui->pushButtonBegin->setEnabled(false);
    ui->pushButtonPause->setEnabled(true);
}

void QThreadDialog::on_pushButtonPause_clicked()
{
    thread.dicePause();
    timer.stop();
    ui->pushButtonBegin->setEnabled(true);
    ui->pushButtonPause->setEnabled(false);
}



void QThreadDialog::on_pushButtonClear_clicked()
{
    ui->plainTextEdit->clear();
}

void QThreadDialog::threadStatusStart()
{
    ui->labelStatus->setText("thread started");
}

void QThreadDialog::threadStatusFinished()
{
    ui->labelStatus->setText("thread finished");
}

void QThreadDialog::threadNewValue(int seq, int diceValue)
{
    QString str = QString::asprintf(u8"第%d次投掷骰子,点数为:%d", seq, diceValue);
    ui->plainTextEdit->appendPlainText(str);
}

void QThreadDialog::onTimeOut()
{
    int tmpSeq =0, tmpValue = 0;
    bool valid = thread.readValue(&tmpSeq, &tmpValue);
    if(valid && (tmpSeq != mSeq)) {
        mSeq = tmpSeq;
        mDiceValue = tmpValue;
        QString str = QString::asprintf(u8"第%d次投掷骰子,点数为:%d", mSeq, mDiceValue);
        ui->plainTextEdit->appendPlainText(str);
    }
}




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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

java多线程使用与踩坑

SpringBoot使用多线程简单方法&#xff1a;地址 线程安全查阅资料参考&#xff1a;地址 背景&#xff1a; 经过上述资料查看&#xff0c;我想写个方法&#xff08;依靠notify()唤醒&#xff0c;依靠wait()等待&#xff09;实现两个线程轮流打印。 实现&#xff1a; 1.线程池配…

语言教育App头牌Duolingo如何重新点燃用户增长350%?

Duolingo是全球最大的语言教育APP&#xff0c;拥有数亿用户&#xff0c;然而用户增长正在放缓&#xff0c;本案例以Duolingo增长 通过数据建模洞察关键指标&#xff0c;并围绕指标用增长实验驱动&#xff0c;设计植根于创新的增长模式&#xff0c;包括启动排行榜&#xff0c;重…

一、初识 Web3

瑾以此系列文章&#xff0c;献给那些出于好奇并且想要学习这方面知识的开发者们 在多数时间里&#xff0c;我们对 web3 的理解是非常模糊的 就好比提及什么是 web1 以及 web2&#xff0c;相关概念的解释是&#xff1a; 1. 从 Web3 的开始 Web3&#xff0c;也被称为Web3.0&…

对接阿里支付宝支付

1. 账号注册 注册地址: 支付宝 文档地址: 小程序文档 - 支付宝文档中心 2.登录商家平台 登录地址: https://b.alipay.com/page/portal/home 1. 产品中心 - 当面付 - 申请开通 3. 登录开放平台 访问地址: 支付宝开放平台 1. 控制台 - 网页移动应用 2. 进入应用详情 - 开发…

nRF Sniffer 在Wireshark中的使用

一、简介 使用nRF Sniffer在wireshark中抓包是经常使用的。但是每次抓包会获取到空气中所有的数据包&#xff0c;数据量非常大。而对于开发人员而言&#xff0c;只需要其中特定的信息。此时就需要掌握数据的过滤语句。 二、过滤 1.根据MAC地址进行过滤 btle.advertising_add…

蓝桥杯刷题-替换字符

代码&#xff1a; 顺着题目意思写即可 sinput() nint(input()) for i in range(n):l, r, x, y input().split() if x not in s[int(l)-1:int(r)]: # 如果待替换字符不在区间内则跳过continueelse:# 找到待替换字符的位置&#xff0c;用replace函数进行替换ss[:int(l)-1]s[in…

Qt 坐标位置转换

Qt 坐标位置转换 文章目录 Qt 坐标位置转换常见的位置坐标转换Qt窗体中常用坐标的区别与获取途径当前光标相对于屏幕的绝对位置当前光标相对于当前窗口的位置鼠标事件发生的位置窗体的位置判断鼠标光标是否悬浮在某个子控件上 从事Qt快一年了 &#xff0c;在做坐标转换的时候容…

linux下设置背景

参考https://zhidao.baidu.com/question/1778024793821420060.html 我要在QWidget里设置背景&#xff0c;之前在windows里选中对应的QWidget对象&#xff0c;右键changeStyleSheet后有个小笔一样的编辑&#xff0c;可以添加资源&#xff0c;并设置为背景&#xff1b;但是linux…

x-zse-96,android端,伪dex加固,so加固,白盒AES,字符串加密

x-zse-96,android端,伪dex加固,so加固,白盒AES,字符串加密 上一篇某招聘软件的sig及sp参数被和谐掉了,所以懂得都懂啊! 因为web的api没有那么全,所以来看了下app的,ios的防护几乎没有,纸糊的一样,android端的有点复杂了,到最后我也没能完整的实现整个加密过程,我也只复现到DF…

【MySql实战--日志系统:一条SQL更新语句是如何执行的?】

前面我们系统了解了一个查询语句的执行流程&#xff0c;并介绍了执行过程中涉及的处理模块。相信你还记得&#xff0c;一条查询语句的执行过程一般是经过连接器、分析器、优化器、执行器等功能模块&#xff0c;最后到达存储引擎。 那么&#xff0c;一条更新语句的执行流程又是怎…

亮数据代理IP轻松解决爬虫数据采集痛点

文章目录 一、爬虫数据采集痛点二、为什么使用代理IP可以解决&#xff1f;2.1 爬虫和代理IP的关系2.2 使用代理IP的好处 三、亮数据代理IP的优势3.1 IP种类丰富3.1.1 动态住宅代理IP3.1.2 静态住宅代理IP3.1.3 机房代理IP3.1.4 移动代理IP 3.2 高质量IP全球覆盖3.3 超级代理服务…

UE4 Json事件设置Asset值

通过Json事件来设置&#xff0c;比如骨骼网格体&#xff08;换皮&#xff09;等等

【漏洞复现】1. WebLogic 反序列化漏洞(CVE-2019-2890)复现与分析

文章目录 1. 基础知识2. 复现2.1 漏洞介绍漏洞影响版本&#xff1a; 2.2 漏洞原理分析2.3 漏洞复现2.3.1 环境搭建2.3.2 漏洞验证2.3.3 漏洞利用2.3.4 POC分析 2.4 漏洞修复 1. 基础知识 WebLogic是美国Oracle公司出品的一个application server&#xff0c;确切的说是一个基于J…

区域规划(Regional Planning)的学习笔记

目录 一、概念题 1.区域的概念、类型、特性 2.区域分析的概念、主要内容 3.自然环境、自然资源的概念 4.区域自然资源评价的内容 5.可持续发展理论定义 6.经济增长、经济结构定义 7.产业结构概念 8.人口增长分析的含义、指标 9.技术进步概念、类型 10.技术进步对区域…

『Python爬虫』极简入门

本文简介 点赞 收藏 关注 学会了 声明&#xff1a;请勿使用爬虫技术获取公民隐私数据、数据以及企业或个人不允许你获取的数据。 本文介绍如何使用 Python 写一只简单的爬虫&#xff0c;作为入门篇&#xff0c;这个程序不会很复杂&#xff0c;但至少可以讲明爬虫是个什么东…

Nacos 配置管理-快速入门

** Nacos 配置管理-快速入门 ** 2024-3-18 段子手168 1、首先在 nacos 发布配置&#xff08;确认安装启动了 nacos 服务&#xff09;。 浏览器访问 http://127.0.0.1:8848/nacos, 打开 nacos 控制台&#xff0c; 并点击菜单&#xff1a;新增 --》配置管理 --》配置列表 --》…

html5cssjs代码 034 自定义字体

html5&css&js代码 034 自定义字体 一、代码二、解释 这是一个带有自定义字体的网页&#xff0c;设置了页面背景颜色、文字颜色以及全局样式。它定义了三种自定义字体并通过font-face规则引入外部字体文件&#xff0c;并通过CSS类&#xff08;.f1, .f2, .f3&#xff09;…

2024上半年四川省属事业单位报名指南✅

⏰报考时间 1⃣报名时间&#xff1a;2024年3月21日10:00——3月25日18:00 2⃣缴费时间&#xff1a;截止2024年3月26日18:00 ⚠通过网络报名且上传相片质量合格的报考者&#xff0c;未按要求在规定时间内进行网上缴费的&#xff0c;视为自动放弃报考。 3⃣公共科目笔试时间&…

力扣---两数相加

给你两个 非空 的链表&#xff0c;表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的&#xff0c;并且每个节点只能存储 一位 数字。 请你将两个数相加&#xff0c;并以相同形式返回一个表示和的链表。 你可以假设除了数字 0 之外&#xff0c;这两个数都不会以 0 …

QGIS开发笔记(一):QGIS介绍、软件下载和加载shp地图数据Demo

若该文为原创文章&#xff0c;转载请注明原文出处 本文章博客地址&#xff1a;https://hpzwl.blog.csdn.net/article/details/136888334 红胖子网络科技博文大全&#xff1a;开发技术集合&#xff08;包含Qt实用技术、树莓派、三维、OpenCV、OpenGL、ffmpeg、OSG、单片机、软硬…