首页 > 其他分享 >分布式grade:IDL_DataReader

分布式grade:IDL_DataReader

时间:2025-01-12 09:01:32浏览次数:3  
标签:states DataReader userDataVector grade CDRData GradeDataReader sample IDL

源程序:【免费】分布式grade:IDL-DataReader资源-CSDN文库

#include "IDL_DataReader1.h"

GradeDataReader::GradeDataReader(DataReaderImpl * pDataReaderImpl)
    :DataReader(pDataReaderImpl)
{
}

GradeDataReader::~GradeDataReader() 
{
}

GradeDataReader* GradeDataReader::narrow(DataReader* pDataReader) 
{
    if (!pDataReader)
        return NULL;

    GradeDataReader *aGradeDataReader = (GradeDataReader*)pDataReader;
    return aGradeDataReader;
}

ReturnCode_t GradeDataReader::take(GradeSeq & data_values, SampleInfoSeq sample_infos, int max_samples, SampleStateKind sample_states, ViewStateKind view_states, InstanceStateKind instance_states)
{
    UserDataVector userDataVector;
    DataReader::take(userDataVector, sample_infos, max_samples, sample_states, view_states, instance_states);

    data_values.ensure_length(userDataVector.size(), userDataVector.size());
    for (int i = 0; i < userDataVector.size(); i++)
    {
        CDR* CDRData = new CDR((unsigned char *)userDataVector[i].pData + 4, userDataVector[i].ilength - 4, MY_BYTE_SEX, 1);
        data_values[i].UnMarshal(CDRData);
        if (CDRData)
            delete CDRData;
        delete userDataVector[i].pData;
    }
    return ReturnCode_t();
}

ReturnCode_t GradeDataReader::read(GradeSeq & data_values, SampleInfoSeq sample_infos, int max_samples, SampleStateKind sample_states, ViewStateKind view_states, InstanceStateKind instance_states)
{
    UserDataVector userDataVector;
    DataReader::read(userDataVector, sample_infos, max_samples, sample_states, view_states, instance_states);

    data_values.ensure_length(userDataVector.size(), userDataVector.size());
    for (int i = 0; i < userDataVector.size(); i++)
    {
        CDR* CDRData = new CDR((unsigned char *)userDataVector[i].pData + 4, userDataVector[i].ilength - 4, MY_BYTE_SEX, 1);
        data_values[i].UnMarshal(CDRData);
        if (CDRData)
            delete CDRData;
        delete userDataVector[i].pData;
    }
    return ReturnCode_t();
}


ReturnCode_t GradeDataReader::take_next_sample(Grade& receivedData, SampleInfo & sample_info)
{
    UserData userData;
    DataReader::take_next_sample(userData, sample_info);
    CDR* CDRData = new CDR((unsigned char *)userData.pData + 4, userData.ilength - 4, MY_BYTE_SEX, 1);
    receivedData.UnMarshal(CDRData);
    if (CDRData)
    {
        delete CDRData;
    }
    return ReturnCode_t();
}

这段代码是一个使用Data Distribution Service (DDS) 的C++实现,特别是针对一个名为GradeDataReader的类,这个类用于读取特定类型的数据——在这个例子中,是“成绩”数据。DDS是一种中间件技术,用于实时数据分发,广泛应用于需要高性能和低延迟的数据通信场景,如汽车、航空航天、军事等领域。

类构造函数和析构函数

  • GradeDataReader::GradeDataReader(DataReaderImpl * pDataReaderImpl):构造函数,接收一个指向DataReaderImpl的指针作为参数。这个构造函数通过调用基类DataReader的构造函数来初始化对象。
  • GradeDataReader::~GradeDataReader():析构函数,用于清理对象。在这个例子中,析构函数为空,意味着没有特定的资源需要手动释放。

narrow 方法

  • GradeDataReader* GradeDataReader::narrow(DataReader* pDataReader):这个静态方法尝试将一个指向DataReader的指针转换为指向GradeDataReader的指针。如果转换成功,返回转换后的指针;如果pDataReaderNULL,则返回NULL。这里的转换实际上没有进行类型检查,直接进行了强制类型转换,这在实际应用中可能会导致运行时错误,除非调用者确保传入的pDataReader实际上是指向GradeDataReader或其派生类的指针。

数据读取方法

  • ReturnCode_t GradeDataReader::take(GradeSeq & data_values, ...) 和 ReturnCode_t GradeDataReader::read(GradeSeq & data_values, ...):这两个方法用于从数据读取器中获取数据。take方法从底层缓冲区移除数据,而read方法读取数据但不移除。这两个方法都接收一个GradeSeq(一个序列,用于存储成绩数据)和其他参数,如最大样本数、样本状态等。它们首先将数据读取到一个中间格式(UserDataVector),然后将这些数据反序列化(通过UnMarshal方法)到GradeSeq中。

  • ReturnCode_t GradeDataReader::take_next_sample(Grade& receivedData, SampleInfo & sample_info):这个方法用于获取下一个可用的样本。它接收一个Grade对象和一个SampleInfo对象作为参数,用于存储获取的数据和样本信息。数据同样是通过反序列化从中间格式转换而来。

数据处理细节

  • 在处理数据时,代码使用了CDR(Common Data Representation)进行数据的反序列化。CDR是一种用于在异构系统之间交换数据的标准格式。在创建CDR对象时,代码跳过了数据的前4个字节(可能是因为这些数据包含了元数据或其他不需要的信息),并且指定了字节序(MY_BYTE_SEX)和版本(硬编码为1)。
  • 在反序列化完成后,代码释放了用于存储中间格式数据的内存。

注意事项

  • 这段代码直接进行了类型转换而没有进行类型检查,这在实际应用中可能会导致问题。
  • 使用了硬编码的数值(如跳过前4个字节)和常量(如MY_BYTE_SEX),这可能会影响代码的可移植性和可维护性。
  • 代码中没有错误处理逻辑,例如,在内存分配失败或反序列化出错时没有相应的处理。
  • ReturnCode_t的构造函数被调用但没有传递任何参数,这意味着它可能默认表示成功。然而,这种用法没有提供关于操作结果的详细信息。

标签:states,DataReader,userDataVector,grade,CDRData,GradeDataReader,sample,IDL
From: https://blog.csdn.net/XLYcmy/article/details/145036791

相关文章

  • 深入Android架构(从线程到AIDL)_18 SurfaceView的UI多线程02
    目录2、使用SurfaceView画2D图范例一设计GameLoop(把小线程移出来)范例二2、使用SurfaceView画2D图范例一以SurfaceView绘出Bitmap图像设计SpriteView类别来实作SurfaceHolder.Callback接口首先来看个简单的程序,显示出一个Bitmap图像。这个图像就构成Sprite动画的基......
  • 深入Android架构(从线程到AIDL)_17 SurfaceView的UI多线程01
    1、View与SurfaceView之区别SurfaceView是View的子类,其内嵌了一个用来绘制的Surface。当SurfaceView成为可见时,就会诞生Surface;反之当SurfaceView被隐藏时,就会删除Surface,以便节省资源。程序里可以控制Surface的大小,SurfaceView可控制Surface的绘图位置。View组件是由UI线......
  • 深入Android架构(从线程到AIDL)_13 线程安全的化解之例
    目录7、线程安全的化解之例复习:Android单线程环境非单线程环境的线程安全议题    范例-1范例-2​编辑同步(Synchronization)化解线程安全的问题7、线程安全的化解之例复习:Android单线程环境View是一个单线程的类;其意味着:此类的撰写着心中意图只让有一个线......
  • 深入Android架构(从线程到AIDL)_14 应用Android的UI框架01
    应用Android的UI框架系列:以设计游戏循环(GameLoop)为例,內容如下:1.UI线程、View与onDraw()函数2.基本游戏循环(GameLoop)3.使用UI线程的MQ(MessageQueue)4.诞生一个小线程,担任游戏线程5.小线程調用postInvalidate()6.设计一个GameLoop类别7.只诞生一次GameLoop......
  • js requestIdleCallback使用,避免阻塞主线程页面主要js执行
    requestIdleCallback是一个浏览器提供的API,用于在主线程空闲时执行低优先级的操作,而不会阻塞主线程的执行。这对于执行一些非紧急的任务(如统计、数据预处理等)非常有用。以下是requestIdleCallback的基本使用方法:定义一个回调函数:这个函数将在主线程空闲时执行。调用reque......
  • Visualization Upgrades Reveal Hidden cosmetic trends in Florida
    VisualizationUpgradesRevealHiddencosmetictrendsinFloridaDecember11,2024byJingyuGuo,YingqiLiu,ZhenyuHe,QinyaZhuDatavisualizationsareanessentialtoolforcommunicatingcomplexinformationinaclearandimpactfulway.However,notal......
  • Not using native diff for overlay2, this may cause degraded performance……
    问题现象案例:Anolis8.9(4.19.91-26.an8.x86_64)+Overlay2存储驱动程序) 当我们安装好Docker之后,通过systemctlstatusdocker-l会发现有一个告警信息:level=warningmsg="Notusingnativediffforoverlay2,thismaycausedegradedperformanceforbuildingimages:ke......
  • 你知道什么是空闲回调(requestIdleCallback)吗?
    是的,我知道requestIdleCallback。它是一个浏览器API,允许开发者在浏览器空闲时期运行低优先级任务,例如更新UI或执行非关键计算,从而避免阻塞主线程并保持应用的流畅性。以下是requestIdleCallback的一些关键特性:利用浏览器空闲时间:requestIdleCallback会在浏览器空闲时......
  • requestIdleCallback在EventLoop的什么阶段执行?如何执行?
    requestIdleCallback在浏览器的事件循环(EventLoop)中,空闲阶段(IdlePhase)执行。它会在浏览器完成其他高优先级任务(例如处理用户输入、渲染页面、执行JavaScript等)后,并且有剩余时间时才会被调用。执行方式:注册回调函数:使用requestIdleCallback(callback,options)注册......
  • 如何在IDLE中使用海龟画图
    大家看别人使用海龟画图是不是非常羡慕,可是自己虽然会python但不知如何下手,今天就让我来教你吧!导入海龟画图库海龟画图是导入了turtle库来进行编写程序的,而turtle这一个库却是在IDLE安装时就一同下载了的,所以你用的IDE如果不是IDLE,那另当别论。其实我也不知道~importturtle......