048-第三代软件开发-数据回放

news2024/11/24 14:12:46
头图

第三代软件开发-数据回放

文章目录

  • 第三代软件开发-数据回放
    • 项目介绍
    • 数据回放

关键字: QtQmlDataplay back数据

项目介绍

欢迎来到我们的 QML & C++ 项目!这个项目结合了 QML(Qt Meta-Object Language)和 C++ 的强大功能,旨在开发出色的用户界面和高性能的后端逻辑。

在项目中,我们利用 QML 的声明式语法和可视化设计能力创建出现代化的用户界面。通过直观的编码和可重用的组件,我们能够迅速开发出丰富多样的界面效果和动画效果。同时,我们利用 QML 强大的集成能力,轻松将 C++ 的底层逻辑和数据模型集成到前端界面中。

在后端方面,我们使用 C++ 编写高性能的算法、数据处理和计算逻辑。C++ 是一种强大的编程语言,能够提供卓越的性能和可扩展性。我们的团队致力于优化代码,减少资源消耗,以确保我们的项目在各种平台和设备上都能够高效运行。

无论您是对 QML 和 C++ 开发感兴趣,还是需要我们为您构建复杂的用户界面和后端逻辑,我们都随时准备为您提供支持。请随时联系我们,让我们一同打造现代化、高性能的 QML & C++ 项目!

重要说明☝

☀该专栏在第三代软开发更新完将涨价

数据回放

额,今天看代码才发现,这部分代码还是Demo阶段,只能看部分了

#include "XXX_dataplayback.h"
#include "ui_XXX_dataplayback.h"

XXX_dataPlayBack::XXX_dataPlayBack(QWidget *parent,QString strDBPath) :
    QWidget(parent),
    ui(new Ui::XXX_dataPlayBack),
    m_strDBPath(strDBPath)
{
    ui->setupUi(this);


    initUI();
    getListDBName();
}

XXX_dataPlayBack::~XXX_dataPlayBack()
{
    deleteDBThread();
    delete ui;
}

void XXX_dataPlayBack::slotTimerMove()
{
    //qDebug() << "slotTimerMove";
    QTime timer;
    timer.start();

    int iIndex = ui->hSlider_move->value();
    ui->hSlider_move->setValue(iIndex+8*m_iFrequency);


    int iSKye = XXX_BaseDB::instance()->g_vectorKey.at(0);
    int iLeft = m_pDraw1->gCustomplot->xAxis->range().lower+8*m_iFrequency;

    int iDff = iLeft - iSKye;
    if(iDff > 0)
    {
        XXX_BaseDB::instance()->m_mutexThread.lock();
        if(iDff >= XXX_BaseDB::instance()->g_vectorKey.count())
        {
            XXX_BaseDB::instance()->g_vectorKey.clear();
            XXX_BaseDB::instance()->g_vectorTime.clear();
            XXX_BaseDB::instance()->g_mapTime.clear();
            XXX_BaseDB::instance()->g_vectorData1.clear();
            XXX_BaseDB::instance()->g_vectorData2.clear();
        }
        else
        {
            XXX_BaseDB::instance()->g_vectorKey.remove(0,iDff);
            XXX_BaseDB::instance()->g_vectorTime.remove(0,iDff);
            XXX_BaseDB::instance()->g_vectorData1.remove(0,iDff);
            XXX_BaseDB::instance()->g_vectorData2.remove(0,iDff);
        }
        XXX_BaseDB::instance()->m_mutexThread.unlock();

    }

    ui->label_RunTime->setText(XXX_BaseDB::instance()->g_mapTime.value(m_pDraw1->gCustomplot->xAxis->range().upper));

    qDebug() << "XXX_BaseDB::instance()->g_vectorKey" << XXX_BaseDB::instance()->g_vectorKey.count();


    int iMaxY = quiteMaxData();

    m_pDraw1->setYHeiget(iMaxY);
    m_pDraw2->setYHeiget(iMaxY);


    m_pDraw1->setDataPad(XXX_BaseDB::instance()->g_vectorKey,XXX_BaseDB::instance()->g_vectorData1);
    m_pDraw2->setDataPad(XXX_BaseDB::instance()->g_vectorKey,XXX_BaseDB::instance()->g_vectorData2);


    m_pDraw1->slotMovePad(ui->hSlider_move->value(),m_iPlayX);
    m_pDraw2->slotMovePad(ui->hSlider_move->value(),m_iPlayX);

}


void XXX_dataPlayBack::slotSliderPressed()
{

    if(m_timerMove == nullptr)
        return;
    m_timerMove->stop();

    XXX_BaseDB::instance()->stopDBThread(true);
    XXX_BaseDB::instance()->exitDBThread(false);


}

void XXX_dataPlayBack::slotSliderReleased()
{
    if(m_bRunTimer)
    {
        if(m_timerMove == nullptr)
            return;

        if(ui->hSlider_move->value() < m_iPlayX)
            XXX_BaseDB::instance()->setStartGetID(0,m_iPlayX);
        else
            XXX_BaseDB::instance()->setStartGetID(ui->hSlider_move->value()-m_iPlayX,m_iPlayX);
        XXX_BaseDB::instance()->exitDBThread(true);
        XXX_BaseDB::instance()->stopDBThread(false);

        QThread::msleep(100);
        m_timerMove->start(m_iFrequency);

    }
    else
    {
        if(m_timerMove == nullptr)
            return;

        if(ui->hSlider_move->value() < m_iPlayX)
            XXX_BaseDB::instance()->setStartGetID(0,m_iPlayX);
        else
            XXX_BaseDB::instance()->setStartGetID(ui->hSlider_move->value()-m_iPlayX,m_iPlayX);
        XXX_BaseDB::instance()->exitDBThread(true);
        XXX_BaseDB::instance()->stopDBThread(false);


    }

}

void XXX_dataPlayBack::slotSliderMoved()
{
    qDebug() << "ui->hSlider_move->value()" << ui->hSlider_move->value();

    QString strRunTime;
    XXX_BaseDB::instance()->getFirstTime(ui->hSlider_move->value(),strRunTime);

    ui->label_RunTime->setText(strRunTime);

    if(m_timerMove == nullptr)
        return;
    QTime timer;
    timer.start();

    int iIndex = ui->hSlider_move->value();
    if(iIndex < m_iPlayX)
    {
        XXX_BaseDB::instance()->getDataBase(iIndex,iIndex);
    }
    else
    {
        XXX_BaseDB::instance()->getDataBase(iIndex,m_iPlayX);
    }

    int iMaxY = quiteMaxData();
    m_pDraw1->setYHeiget(iMaxY);

    m_pDraw1->setDataPad(XXX_BaseDB::instance()->g_vectorOneKey,XXX_BaseDB::instance()->g_vectorOneData1);
    m_pDraw1->slotMovePad(iIndex,m_iPlayX);

    m_pDraw2->setYHeiget(iMaxY);

    m_pDraw2->setDataPad(XXX_BaseDB::instance()->g_vectorOneKey,XXX_BaseDB::instance()->g_vectorOneData2);
    m_pDraw2->slotMovePad(iIndex,m_iPlayX);


    qDebug() << "Time elapsed: " << timer.elapsed() << "ms";
}

void XXX_dataPlayBack::slotZoomIn()
{
    ui->pushButton_zoom_out->setVisible(true);
    if(m_iPlayX>1*8000)
    {
        m_iPlayX-=8000;
    }
    else if(m_iPlayX>1000)
    {
        m_iPlayX-=1000;
    }
    else if(m_iPlayX>100)
    {
        m_iPlayX-=100;
    }
    else
    {
        m_iPlayX = 100;
    }

    zoomUpdate();
}

void XXX_dataPlayBack::slotZoomOut()
{
    ui->pushButton_zoom_in->setVisible(true);
    if(m_iPlayX>=20*8000)
    {
        m_iPlayX = 20*8000;
    }
    else if(m_iPlayX>1*8000)
    {
        m_iPlayX += 1*8000;

    }
    else if(m_iPlayX>=1000)
    {
        m_iPlayX += 1000;

    }
    else if(m_iPlayX>=100)
    {
        m_iPlayX += 100;

    }
    else
    {
        m_iPlayX = 100;
    }

    zoomUpdate();

}

void XXX_dataPlayBack::zoomUpdate()
{

    int iIndex = ui->hSlider_move->value();
    if(iIndex < m_iPlayX)
    {
        XXX_BaseDB::instance()->getDataBase(iIndex,iIndex);
    }
    else
    {
        XXX_BaseDB::instance()->getDataBase(iIndex,m_iPlayX);
    }

    int iMaxY = quiteMaxData();
    m_pDraw1->setYHeiget(iMaxY);
    m_pDraw2->setYHeiget(iMaxY);

    m_pDraw1->setDataPad(XXX_BaseDB::instance()->g_vectorOneKey,XXX_BaseDB::instance()->g_vectorOneData1);
//    m_pDraw1->slotMovePad(iIndex,m_iPlayX);

    m_pDraw2->setDataPad(XXX_BaseDB::instance()->g_vectorOneKey,XXX_BaseDB::instance()->g_vectorOneData2);
//    m_pDraw2->slotMovePad(iIndex,m_iPlayX);



    m_pDraw1->slotMovePad(ui->hSlider_move->value(),m_iPlayX);
    m_pDraw2->slotMovePad(ui->hSlider_move->value(),m_iPlayX);
}

void XXX_dataPlayBack::initUI()
{
    QColor color1(255,0,0);
    QColor color2(0,255,0);
    m_pDraw1 = new XXX_DrawCurve(color1,this);
    m_pDraw2 = new XXX_DrawCurve(color2,this);

    QHBoxLayout *hBox1 = new QHBoxLayout(ui->widge_dataPlay_1);
    QHBoxLayout *hBox2 = new QHBoxLayout(ui->widge_dataPlay_2);
    hBox1->addWidget(m_pDraw1);
    hBox2->addWidget(m_pDraw2);




    //启用长按
    ui->pushButton_zoom_in->setAutoRepeat(true);
    //触发长按的时间
    ui->pushButton_zoom_in->setAutoRepeatDelay(400);
    //长按时click信号间隔
    ui->pushButton_zoom_in->setAutoRepeatInterval(50);


    ui->pushButton_zoom_out->setAutoRepeat(true);
    ui->pushButton_zoom_out->setAutoRepeatDelay(400);
    ui->pushButton_zoom_out->setAutoRepeatInterval(50);



    connect(ui->pushButton_zoom_in,&QPushButton::clicked,this,&XXX_dataPlayBack::slotZoomIn);
    connect(ui->pushButton_zoom_out,&QPushButton::clicked,this,&XXX_dataPlayBack::slotZoomOut);


    ui->pushButton_zoom_in->setVisible(false);
    ui->pushButton_zoom_out->setVisible(false);


    ui->hSlider_move->setRange(0,m_iPlayX);

    m_timerMove = new QTimer;
    m_timerMove->setTimerType(Qt::PreciseTimer);

    connect(m_timerMove, &QTimer::timeout, this, &XXX_dataPlayBack::slotTimerMove);


    //
    connect(ui->hSlider_move, &QSlider::sliderPressed, this, &XXX_dataPlayBack::slotSliderPressed);
    connect(ui->hSlider_move, &QSlider::sliderReleased, this, &XXX_dataPlayBack::slotSliderReleased);
    connect(ui->hSlider_move, &QSlider::sliderMoved, this, &XXX_dataPlayBack::slotSliderMoved);
}


void XXX_dataPlayBack::getListDBName()
{
    if(m_strDBPath.isEmpty())
    {
        return;
    }
    QDirIterator it(m_strDBPath, QDir::Files | QDir::NoSymLinks | QDir::NoDotAndDotDot | QDir::AllDirs, QDirIterator::Subdirectories);
    while(it.hasNext())
    {
        it.next();
        if(it.fileInfo().suffix() == "db")
        {
            QString strDBName = it.fileName().split(".").at(0);
            m_listDBName.append(strDBName);
        }
    }
    ui->comboBox_DB->addItems(m_listDBName);
}

int XXX_dataPlayBack::quiteMaxData()
{

    int iSurplus = XXX_BaseDB::instance()->g_vectorData1.count() - ui->hSlider_move->value();
    if(iSurplus < 0)
        iSurplus = 0;
    int iFontSurplus = XXX_BaseDB::instance()->g_vectorData1.count() - m_iPlayX - iSurplus;
    if(iFontSurplus< 0)
        iFontSurplus = 0;
    double dMaxID1 = *std::max_element(std::begin(XXX_BaseDB::instance()->g_vectorData1) + iFontSurplus,std::end(XXX_BaseDB::instance()->g_vectorData1)-iSurplus);
    double dMaxID2 = *std::min_element(std::begin(XXX_BaseDB::instance()->g_vectorData2),std::end(XXX_BaseDB::instance()->g_vectorData2));
//    double dMinID1 = *std::min_element(std::begin(XXX_BaseDB::instance()->g_vectorData1),std::end(XXX_BaseDB::instance()->g_vectorData1));
//    double dMinID2 = *std::min_element(std::begin(XXX_BaseDB::instance()->g_vectorData2),std::end(XXX_BaseDB::instance()->g_vectorData2));


    if(dMaxID2>dMaxID1)
    {
        dMaxID1 = dMaxID2;
    }
    int iMaxY = (int(dMaxID1)/10+1)*10;


    return iMaxY;
}

void XXX_dataPlayBack::deleteDBThread()
{
    XXX_BaseDB::instance()->closeDBThread(false);
    XXX_BaseDB::instance()->stopDBThread(true);
    XXX_BaseDB::instance()->exitDBThread(false);


    if(m_threadDBBase->isRunning())
    {
        m_threadDBBase->quit();
        m_threadDBBase->wait();
    }

//    m_threadDBBase = nullptr;
//    delete m_threadDBBase;
//    XXX_BaseDB::instance() = nullptr;
//    delete XXX_BaseDB::instance();
}



void XXX_dataPlayBack::on_comboBox_Table_currentTextChanged(const QString &arg1)
{
    m_strTableName = arg1;
    //XXX_BaseDB::instance()->setOpenTableName(m_strTableName);
    int iMaxID;
    XXX_BaseDB::instance()->setOpenTableName(arg1);
    XXX_BaseDB::instance()->getMaxID(iMaxID);
    ui->hSlider_move->setRange(1,iMaxID);

    QString strMaxTime;
    XXX_BaseDB::instance()->getFirstTime(iMaxID,strMaxTime);

    ui->label_LastTime->setText(strMaxTime);

    m_threadDBBase->start();
    XXX_BaseDB::instance()->exitDBThread(true);
    XXX_BaseDB::instance()->closeDBThread(true);
    XXX_BaseDB::instance()->stopDBThread(false);
    XXX_BaseDB::instance()->setStartGetID(0,m_iPlayX);
    emit signalDBThread();
    QThread::msleep(100);
    m_timerMove->start(m_iFrequency);

}


void XXX_dataPlayBack::on_comboBox_DB_currentIndexChanged(int index)
{
    ui->comboBox_Table->clear();

    QString strOpenDBPath = m_strDBPath + m_listDBName.at(index) + ".db";

    //XXX_BaseDB::instance() = new XXX_BaseDB;

    m_threadDBBase = new QThread(this);

    XXX_BaseDB::instance()->moveToThread(m_threadDBBase);

    connect(this,&XXX_dataPlayBack::signalDBThread,XXX_BaseDB::instance(),&XXX_BaseDB::backDataBaseThread);

    QStringList listTableName;
    bool bRet = XXX_BaseDB::instance()->getDBTableName(strOpenDBPath,listTableName);
    if(!bRet)
    {
        return;
    }
    for (int var = 0; var < listTableName.count(); ++var) {
        if(!listTableName.at(var).contains("Default"))
        {
            listTableName.removeAt(var);
        }
    }
    ui->comboBox_Table->addItems(listTableName);
}


void XXX_dataPlayBack::on_pushButton_start_clicked(bool checked)
{
    //m_bRunTimer = checked;

    m_pDraw1->setLabelView(m_bRunTimer);
    m_pDraw2->setLabelView(m_bRunTimer);
    m_bRunTimer = !m_bRunTimer;

    if(m_bRunTimer)
    {
        if(m_timerMove == nullptr)
            return;

        if(ui->hSlider_move->value() < m_iPlayX)
            XXX_BaseDB::instance()->setStartGetID(0,m_iPlayX);
        else
            XXX_BaseDB::instance()->setStartGetID(ui->hSlider_move->value()-m_iPlayX,m_iPlayX);
        XXX_BaseDB::instance()->exitDBThread(true);
        XXX_BaseDB::instance()->stopDBThread(false);

        m_timerMove->start(m_iFrequency);

        ui->pushButton_zoom_in->setVisible(false);
        ui->pushButton_zoom_out->setVisible(false);
        ui->pushButton_start->setText("暂停");
    }
    else
    {
        if(m_timerMove == nullptr)
            return;
        m_timerMove->stop();

        XXX_BaseDB::instance()->stopDBThread(true);
        XXX_BaseDB::instance()->exitDBThread(false);

        ui->pushButton_zoom_in->setVisible(true);
        ui->pushButton_zoom_out->setVisible(true);

        ui->pushButton_start->setText("播放");


    }

}



博客签名2021

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

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

相关文章

4个杀手级Pycharm高效插件

本文将介绍4个学习Python的人都应该安装的Pycharm插件&#xff0c;通过这些插件提高工作效率并使Pycharm看起来更美观。 1、简介 Pycharm是Python最受欢迎的集成开发环境之一。它具有良好的代码助手、漂亮的主题和快捷方式&#xff0c;使编写代码变得简单快捷。 话虽如此&…

两台linux虚拟机之间实现免密登录

主要实现两台虚拟机之间的免密登录&#xff0c;总所周知&#xff0c;虚拟机之间登录使用的协议是ssh协议&#xff0c;端口号是 22 主机 创建对应的加密文件 [rootweb-2 ~]# ssh-keygen Generating public/private rsa key pair. Enter file in which to save the key (/root/.s…

【每日一题】逃离火灾

文章目录 Tag题目来源题目解读解题思路方法一&#xff1a;二分枚举空间复杂度&#xff1a; O ( m n ) O(mn) O(mn)。 写在最后 Tag 【二分答案】【BFS】【数组】【2023-11-09】 题目来源 2258. 逃离火灾 题目解读 现在有一个人在一个二维网格的左上角&#xff0c;坐标 (0, 0…

2023年11月PHP测试覆盖率解决方案

【题记&#xff1a;最近进行了ExcelBDD PHP版的开发&#xff0c;查阅了大量资料&#xff0c;发现PHP测试覆盖率解决方案存在不同的历史版本&#xff0c;让我花费了蛮多时间&#xff0c;为了避免后人浪费时间&#xff0c;整理本文&#xff0c;而且网上没有给出Azure DevOps里面P…

GPT-4-Turbo的128K长度上下文性能如何?超过73K Tokens的数据支持依然不太好!

本文原文来自DataLearnerAI官方网站&#xff1a;GPT-4-Turbo的128K长度上下文性能如何&#xff1f;超过73K Tokens的数据支持依然不太好&#xff01; | 数据学习者官方网站(Datalearner)https://www.datalearner.com/blog/1051699526438975 GPT-4 Turbo是OpenAI最新发布的号称…

MySQL:锁机制

目录 概述三种层级的锁锁相关的 SQLMyISAM引擎下的锁InnoDB引擎下的锁InnoDB下的表锁和行锁InnoDB下的共享锁和排他锁InnoDB下的意向锁InnoDB下的记录锁&#xff0c;间隙锁&#xff0c;临键锁记录锁&#xff08;Record Locks&#xff09;间隙锁&#xff08;Gap Locks&#xff0…

基于光流法的车辆检测计数算法matlab仿真,对比Horn-Schunck光流和Lucas-Kanade光流

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 4.1 Horn-Schunck光流法 4.2 Lucas-Kanade光流法 5.算法完整程序工程 1.算法运行效果图预览 HS光流 LK光流 2.算法运行软件版本 matlab2022a 3.部分核心程序 ........................…

nav2 调节纯追踪算法

纯追踪算法 纯追踪基础 The core idea is to find a point on the path in front of the robot and find the linear and angular velocity to help drive towards it. 核心思想是在机器人前方的路径上找到一个点&#xff0c;并找到一个合适的线速度和角速度&#xff0c;以驱…

Netty 是如何利用EventLoop实现千万级并发的

经过前面几篇文章的介绍&#xff0c;我们掌握了 Netty 的 5 个核心组件&#xff0c;但是有了这 5 个核心组件 Netty 这个工厂还是无法很好的运转&#xff0c;因为缺少了一个最核心的组件&#xff1a;EventLoop&#xff0c;它 是 Netty 中最最核心的组件&#xff0c;也是 Netty …

竞赛选题 深度学习疫情社交安全距离检测算法 - python opencv cnn

文章目录 0 前言1 课题背景2 实现效果3 相关技术3.1 YOLOV43.2 基于 DeepSort 算法的行人跟踪 4 最后 0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; **基于深度学习疫情社交安全距离检测算法 ** 该项目较为新颖&#xff0c;适合作为竞赛…

SQL 注入漏洞详解

SQL 注入漏洞详解 漏洞描述 sql注入漏洞是指恶意用户在应用与数据库交互的地方利用非法的操作获取数据库内容从以下两点分析: 没有对用户输入的数据进行充分的过滤和验证&#xff0c;导致一些用户利用此漏洞向数据库插入恶意sql语句非法请求数据库从而获得一些敏感数据在与数…

【服务发现与配置】Consul特性及搭建

文章目录 一、前言二、概念2.1、什么是Consul&#xff1f;2.2、Consul具有哪些特点?2.3、Consul 架构图2.4、Consul的使用场景 三、安装3.1. 下载3.2. 解压3.3. 拷贝到usr目录下3.4. 查看 安装是否成功3.5. 启动 四、Consul 开机自启动4.1. 路径/usr/lib/systemd/system/&…

ubuntu 安装redis详细教程

下载redis安装包 链接如下&#xff1a; http://redis.io/download 本例版本为&#xff1a;redis-7.2.3.tar.gz 下载安装包到目录/opt下&#xff0c;路径可修改&#xff0c;本例为/opt wget https://github.com/redis/redis/archive/7.2.3.tar.gz 解压安装包&#xff0c;并…

操作系统 day09(线程)

线程 为什么引入线程 在没引入进程之前&#xff0c;系统中的各个程序只能串行的执行&#xff0c;比如&#xff1a;只能先听歌&#xff0c;再聊QQ。引入进程之后&#xff0c;各个程序可以并发执行&#xff0c;比如&#xff1a;一边听歌&#xff0c;一边聊QQ。但是现在QQ可以一…

C++ 图解二叉树非递归中序 + 实战力扣题

leetCode 94.二叉树的中序遍历 94. 二叉树的中序遍历 - 力扣&#xff08;LeetCode&#xff09; 算法思路&#xff1a; 总结&#xff1a; 对中序遍历这个例子进行总结&#xff0c;找出打印“中”节点的时刻&#xff0c;来寻找本质。打印的是一棵二叉树的“中”节点&#xff0c…

MySQL -- mysql connect

MySQL – mysql connect 文章目录 MySQL -- mysql connect一、Connector/C 使用1.环境安装2.尝试链接mysql client 二、MySQL接口1.初始化2.链接数据库3.下发mysql命令4.获取执行结果5.关闭mysql链接6.在C语言中连接MySQL 三、MySQL图形化界面推荐 使用C接口库来进行连接 一、…

Python按类别和比例从Labelme数据集中划分出训练数据集和测试数据集

Python按类别和比例从Labelme数据集中划分出训练数据集和测试数据集 前言前提条件相关介绍实验环境按类别和比例从Labelme数据集中划分出训练数据集和测试数据集代码实现输出结果 前言 由于本人水平有限&#xff0c;难免出现错漏&#xff0c;敬请批评改正。更多精彩内容&#x…

Java算法(六):模拟评委打分案例 方法封装抽离实现 程序的节流处理

Java算法&#xff08;六&#xff09; 评委打分 需求&#xff1a; 在编程竞赛中&#xff0c;有 6 个评委为参赛选手打分&#xff0c;分数为 0 - 100 的整数分。 选手的最后得分为&#xff1a;去掉一个最高分和一个最低分后 的 4个评委的平均值。 注意程序的节流 package c…

聊聊室内导航在应用方面

大家去大型的商场时&#xff0c;应该都见过一些提示牌&#xff0c;微信扫一扫导航。当拿微信扫了之后&#xff0c;就会打开一个小程序&#xff0c;里面显示整个商场的二维或三维的平面结构&#xff0c;以及当前自己的位置。此时可以通过手机快速的查看商场内其他的商铺、公共区…

NAND Vpass对读干扰和IO性能有什么影响?

1.SSD基础知识 SSD的存储介质是什么&#xff0c;它就是NAND闪存。那你知道NAND闪存是怎么工作的吗&#xff1f;其实&#xff0c;它就是由很多个晶体管组成的。这些晶体管里面存储着电荷&#xff0c;代表着我们的二进制数据&#xff0c;要么是“0”&#xff0c;要么是“1”。NA…