Qt采用线程以队列方式实现下发数据

 更新时间:2022年10月12日 09:32:57   作者:中国好公民st  
在C++中队列是一种常用的数据结构之一,一种特殊的线性表,一般采用先进先出的方式。本文主要为大家介绍了Qt如何以队列方式实现下发数据,感兴趣的可以了解一下

什么叫做队列方式

在C++中队列是一种常用的数据结构之一,一种特殊的线性表,一般采用先进先出的方式。

很多情况下,在做数据处理时,会根据先来后到的原则进行处理。对于少量数据来说,主进程就可以很快完成,所以不需要用到开线程的方式。将处理处理部分封装成一个函数,直接调用就OK了!

假设,数据处理的时间消耗很大时,继续使用主进程处理的话,肯定会导致页面卡死,为了避免页面卡死,最常用的方式就是开线程。

在程序使用过程中肯定不止一个位置进行数据处理,那么,多次调用数据处理时,如何保证按照触发顺序进行数据解析呢?

这是本篇文章中的重点~

想要按照触发顺序下发,必须要对下发的数据进行排队,这里用到的容器是list。方便添加、删除。

容器:std::list m_list; //存储数据

1.存储需要处理的数据

std::lock_guard<std::mutex> lck(m_mutexRobotData); //上锁添加数据
m_list.push_back(stData);

在进行数据存储时,进行上锁处理,因为在线程中每处理一条数据,需要进行删除,防止出错。

2.开启线程

m_pThreadSendCmd = std::thread(&QWidget::ProcessingThread, this);
m_pThreadSendCmd.detach();

这里用到的是C11方式开启线程,有一个弊端,使用功能detach方式后,已经与程序脱离了,想要控制线程的关闭,保守的做法是由参数来控制。

这里,我才用了bool值,当bool = false时,说明线程停止;true表示线程正在运行。

那么,对上述开启线程方式进行修改,如下:

if (m_bRunningRobotCmd == false)
{
	//线程未开启,开启线程
	qDebug() << QStringLiteral("开启一个新线程");
	m_bRunningRobotCmd = true;
	m_pThreadSendCmd = std::thread(&QWidget::ProcessingThread, this);
	m_pThreadSendCmd.detach();
}

3.线程中数据处理

void QWidget::ProcessingThread()
{
    while(m_bRunningRobotCmd)
    {
        //线程处理
        sleep(200);
    }
    //退出while循环,表示线程结束
}

此时,当m_bRunningRobotCmd = true时,表示线程一直在启动,当m_bRunningRobotCmd = false时,立刻停止线程,这时又会遇到一个问题,正在运行的线程中该如何停止呢?

单纯的m_bRunningRobotCmd = false,很显然停止的概率不大,此时,对安全的做法,需要用互斥量的方式,进行停止

对上述线程开启进行修改,如下:

void QWidget::ProcessingThread()
{
    std::lock_guard<std::mutex> lck(m_mutexControlThread); //上锁添加数据
    while(m_bRunningRobotCmd)
    {
        //线程处理
        sleep(200);
    }
    //退出while循环,表示线程结束
}

关闭线程方式,如下:

m_bRunningRobotCmd = false;
std::lock_guard<std::mutex> lck(m_mutexControlThread);  //插入数据之前,首先加锁

首先将bool值更改,再进行加锁。

4.线程内容实现逻辑

当list容器中存在数据时,需要获取第一条数据,处理后删除第一条数据。

实现代码如下:

if(m_list.size() != 0)
{
    //容器中存在有效数据
    std::lock_guard<std::mutex> lck(m_mutexRobotData); //上锁添加数据
    if(m_list.size() != 0)
    {
        //获取第一条有效数据
        stData stInfo = m_list.front();
        //数据处理
        //删除第一条数据
        m_list.pop_front();
    }
    
}

使用互斥量的方式控制线程增加了安全性,防止崩溃问题。

到此这篇关于Qt采用线程以队列方式实现下发数据的文章就介绍到这了,更多相关Qt队列方式下发数据内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • ​​​​​​​C语言实现单链表基本操作方法

    ​​​​​​​C语言实现单链表基本操作方法

    这篇文章主要介绍了​​​​​​​C语言实现单链表基本操作方法,文章围绕主题展开详细介绍,具有一定的参考价值,需要的小伙伴可以参考一下
    2022-05-05
  • C++实现班级成绩管理系统

    C++实现班级成绩管理系统

    这篇文章主要为大家详细介绍了C++实现班级成绩管理系统,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-02-02
  • C++应用实现简易五子棋游戏

    C++应用实现简易五子棋游戏

    这篇文章主要为大家详细介绍了C++应用实现简易五子棋游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-05-05
  • C++实现扫雷小游戏

    C++实现扫雷小游戏

    这篇文章主要为大家详细介绍了C++实现扫雷小游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-03-03
  • C语言操作符基础知识图文详解

    C语言操作符基础知识图文详解

    这篇文章主要以图文结合的方式为大家详细介绍了C语言位运算基础知识,感兴趣的小伙伴们可以参考一下,希望能给你带来帮助
    2021-08-08
  • Matlab利用随机森林(RF)算法实现回归预测详解

    Matlab利用随机森林(RF)算法实现回归预测详解

    这篇文章主要为大家详细介绍了Matlab如何利用随机森林(RF)算法实现回归预测,以及自变量重要性排序的操作,感兴趣的小伙伴可以了解一下
    2023-02-02
  • C语言全方位讲解数组的使用

    C语言全方位讲解数组的使用

    数组是一组有序的数据的集合,数组中元素类型相同,由数组名和下标唯一地确定,数组中数据不仅数据类型相同,而且在计算机内存里连续存放,地址编号最低的存储单元存放数组的起始元素,地址编号最高的存储单元存放数组的最后一个元素
    2022-04-04
  • Qt实现制作简单的计算器

    Qt实现制作简单的计算器

    计算器是我们生活中很常见的东西,它可以由多种语言多种方式来实现。本文主要介绍的是利用Qt实现的简易计算器的制作,文中的示例代码讲解详细,需要的可以参考一下
    2022-12-12
  • C/C++利用libxml2高效输出XML大文件详解

    C/C++利用libxml2高效输出XML大文件详解

    这篇文章主要给大家介绍了关于C/C++利用libxml2高效输出XML大文件的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧。
    2017-11-11
  • C语言打印华氏-摄氏温度对照表的方法

    C语言打印华氏-摄氏温度对照表的方法

    这篇文章主要介绍了C语言打印华氏-摄氏温度对照表的方法,涉及C语言字符串与数字操作的相关技巧,非常简单实用,需要的朋友可以参考下
    2015-07-07

最新评论