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

头图

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

文章目录

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

关键字: 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

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

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

相关文章

2023.11.9 IDEA 配置 Lombok

目录 什么是 Lombok 如何使用 Lombok Lombok 的 Data 注解 什么是 Lombok Lombok 是一个 Java 库&#xff0c;能自动插入编译器并构建工具&#xff0c;简化 Java 开发它通过注解实现这一目的&#xff0c;可用来帮助开发人员消除 Java 的冗长代码&#xff0c;尤其是对于简单…

华为取消6000万订单影响在扩大,高通嘴硬强调不受影响

高通公布了2023年第三季度的业绩&#xff0c;业绩显示营收下滑24%&#xff0c;净利润下滑36%&#xff0c;不过高通强调预计今年四季度业绩将回升&#xff0c;意思是说华为取消订单带来的影响较小。 一、高通处境不利已延续4年时间 2019年美国对华为采取措施&#xff0c;众多中国…

go-sync-mutex

Sync ​ Go 语言作为一个原生支持用户态进程&#xff08;Goroutine&#xff09;的语言&#xff0c;当提到并发编程、多线程编程时&#xff0c;往往都离不开锁这一概念。锁是一种并发编程中的同步原语&#xff08;Synchronization Primitives&#xff09;&#xff0c;它能保证多…

Django之三板斧的使用,全局配置文件介绍,request对象方法,pycharm链接数据库,Django链接数据库,ORM的增删改查

【1】三板斧(3个方法)的使用 Httpresponse() 括号内写什么字符串&#xff0c;返回的就是什么字符串返回的是字符串 render(request&#xff0c; 静态文件 ) request是固定的静态文件是写在templates文件夹里面的&#xff0c;如&#xff0c;HTML文件 redirect( 重定向的地址 ) 重…

利用三次样条插值调整鱼眼扭曲程度

本文利用三次样条插值算法&#xff0c;改变鱼眼扭曲程度。效果如下图所示&#xff1a; 源码下载地址&#xff1a;利用三次样条插值算法更改鱼眼特效的扭曲程度资源-CSDN文库 &#xff08;说明&#xff1a;源码基于QT和opencv &#xff09; 主要代码 鱼眼扭曲 void fisheye(…

在Windows 10上安装单机版的hadoop-3.3.5

1、Hadoop是一个由Apache基金会所开发的分布式系统基础架构。用户可以不需要了解分布式底层细节的情况下&#xff0c;开发分布式程序。充分利用集群进行高速运算和存储。 2、下载Hadoop&#xff0c;我们在清华大学的镜像站下载 Index of /apache/hadoop/core/hadoop-3.3.6 (t…

Django文件配置、request对象、连接MySQL、ORM

文章目录 Django静态文件及相关配置静态文件前言静态文件相关配置 form表单request对象request请求结果GET请求POST请求 pycharm连接数据库Django连接MySQLDjango ORM简介 Django静态文件及相关配置 在此篇博客我将以一个用户登录页面来引入相关知识 首先我们先编写一个html页面…

一种libuv实现websockets服务的解决方案

方法是libuv用多事件循环来驱动。说起来容易&#xff0c;做起来还是比下面的方法更容易&#xff1a; 上图是某位网友的方法代表子大部分网络资料。此方法对部署不友好&#xff0c;因为软件仓库提供的libwebsockets是不能用了。如何简化部署&#xff0c;利用好现有的软件仓库呢&…

vue开发环境搭建部署(mac版)

前言 目前后端工作越来越少了&#xff0c;年底了&#xff0c;为了先过验收。项目负责人、产品、需求制定的方案就是先做假页面&#xff0c;所以前端的活多点。 其实现在不喜欢搞前端&#xff0c;原因很多&#xff0c;但是感觉现在似乎流行的码林绝学又是九九归一的瓶颈期…

【Kurbernetes资源管理】声明式资源管理+配置清单文件详解(附实例)

声明式 一、声明式资源管理方式1.1 简介1.2 基本语法1.3 子命令详解1.3.1 获取资源配置清单1.3.2 创建/更新资源补充&#xff1a;creat和apply的区别 1.3.3 删除资源----- delete1.3.4 编辑资源配置 -----edit1.3.5 获取资源的解释-----explain 二、资源清单格式详解2.1 yaml语…

Flutter 第三方 flutter_screenutil(屏幕适配)

一直觉得自己写的不是技术&#xff0c;而是情怀&#xff0c;一个个的教程是自己这一路走来的痕迹。靠专业技能的成功是最具可复制性的&#xff0c;希望我的这条路能让你们少走弯路&#xff0c;希望我能帮你们抹去知识的蒙尘&#xff0c;希望我能帮你们理清知识的脉络&#xff0…

Git的基本使用

目录 一.Git的简介 1.1 Git与SVN的区别&#xff08;优势与劣势&#xff09; 1.2 Git的工作流程 二.Git的安装及常用命令 2.1 使用前准备 ​编辑 ​编辑 2.2 在Windows中安装Git 官网链接 Git - Downloadshttps://git-scm.com/downloads 2.3 Git的常用命令 三、Git命令…

人工智能-卷积神经网络之多输入多输出通道

多输入多输出通道 每个图像的多个通道和多层卷积层。例如彩色图像具有标准的RGB通道来代表红、绿和蓝。 但是到目前为止&#xff0c;我们仅展示了单个输入和单个输出通道的简化例子。 这使得我们可以将输入、卷积核和输出看作二维张量。 当我们添加通道时&#xff0c;我们的输…

基于SpringBoot+Redis的前后端分离外卖项目-苍穹外卖(二)

新增员工功能开发 1. 新增员工1.1 需求分析和设计1.1.1 产品原型1.1.2 接口设计1.1.3 表设计 1.2 代码开发1.2.1 设计DTO类1.2.2 Controller层1.2.3 Service层接口1.2.4 Service层实现类1.2.5 Mapper层 1.3 功能测试1.3.1 接口文档测试 1.4 代码完善1.4.1 问题一1.4.2 问题二1.…

H5网页漫画小说苹果cms模板源码/支持对接公众号/支持三级分销

H5网页漫画小说苹果cms模板源码&#xff0c;支持对接公众号、支持三级分销&#xff0c;评论、收藏、历史记录、三级分销。 独有的模板搜索功能&#xff0c;微信、qq防红&#xff0c;站外采集接口、记录阅读章节&#xff0c;SEO优化&#xff08;后台配置&#xff09;&#xff0…

16.字符连接

#include<stdio.h> #include <cstring> int main(){char s1[44];char s2[33];scanf("%s",s1);scanf("%s",s2);strcat(s1,s2) ;printf("连接两个字符为&#xff1a;%s ",s1); return 0;}

Java数据的基本(原始)类型和引用类型的特点差别

本文作为“Java数据类型”一文的补充https://blog.csdn.net/cnds123/article/details/110517272 Java的数据类型可以分为基本类型&#xff08;primitive types&#xff09;和引用类型&#xff08;reference types&#xff09;两大类。在实际编程中&#xff0c;要根据需求选择合…

MySQL json相关函数详解

MySQL提供了一系列的JSON函数&#xff0c;用于解析、提取、修改和操作JSON数据。以下是一些常用的JSON函数及其功能。 以下所有操作都使用该表&#xff08;zone_test&#xff09;用来演示&#xff1a; 一&#xff1a;JSON_OBJECT(key1,value1,key2,value2) 1、作用&#xff1a;…

​软考-高级-系统架构设计师教程(清华第2版)【第1章-绪论-思维导图】​

软考-高级-系统架构设计师教程&#xff08;清华第2版&#xff09;【第1章-绪论-思维导图】 课本里章节里所有蓝色字体的思维导图

Read Completion Boundary (RCB)切分规则

Read Completion Boundary(RCB) 切分规则 Read Completion Boundary(RCB) 简介 当Read Completion 包含multi-completions时&#xff0c;RCB 规定了多个Completions地址的align规则。Spec中规定RCB可以是64 Byte或者128 Byte&#xff0c;该值可以在link_control register中得…