首页 > 其他分享 >COM服务项目中数据块(数组)的高效传输方式

COM服务项目中数据块(数组)的高效传输方式

时间:2023-11-07 10:33:36浏览次数:37  
标签:CComSafeArray arr 服务项目 数据 传输方式 sfArrObj srcDataLen safeArr COM

1. 问题背景

《C#程序与COM服务程序传递数组和字符串的方式》一文中,我提供了数组的传递方式,是通过 atlsafe.h 中 CComSafeArray 模板类来实现的,但是在实际开发过程中发现,直接使用其自身提供的随机数据访问函数进行数据操作速度较慢,在大量传输数据时运行时间不可接受,所以本文记录一种高效传输方式。

 1 STDMETHODIMP_(HRESULT __stdcall) CSimple::GetSourceDataInByte(SAFEARRAY** arr)
 2 {
 3     CComSafeArray<BYTE>* sfArrObj = new CComSafeArray<BYTE>;
 4     // 这里 _sourceData 是 CSimple 中的源数据成员,类型为 void*
 5     BYTE* srcData = static_cast<BYTE*>(_sourceData);
 6     // 调用 Create() 为 sfArrObj 内数据分配内存空间;_srcDataLen 是源数据个数,类型为 ULONG
 7     sfArrObj->Create(_srcDataLen);
 8     for (ULONG i = 0; i < _srcDataLen; ++i) {
 9         sfArrObj->SetAt(i, *(srcData + i));
10     }
11     *arr = sfArrObj->Detach();
12     delete sfArrObj;
13     sfArrObj = NULL;
14     return S_OK;
15 }

这个方法实现中,使用循环赋值的方式对 sfArrObj 中的数据块赋值,实测上亿数据量时运行时间在20秒以上。


 

2. 解决办法

考虑通过内存拷贝方式进行传输,需要用到标准库中的 memcpy() 函数。

 1 STDMETHODIMP_(HRESULT __stdcall) CSimple::GetSourceDataInByte(SAFEARRAY** arr)
 2 {
 3     CComSafeArray<BYTE>* sfArrObj = new CComSafeArray<BYTE>;
 4     sfArrObj->Create(_srcDataLen);
 5     SAFEARRAY* safeArr = sfArrObj->Detach();
 6     memcpy(_safeArr->pvData, _sourceData, _srcDataLen * sizeof(BYTE));
 7     sfArrObj->Attach(safeArr);
 8     *arr = sfArrObj->Detach();
 9     delete sfArrObj;
10     sfArrObj = NULL;
11     safeArr = NULL;
12     return S_OK;
13 }

通过这种方式传输亿级数据仅需3秒左右。

标签:CComSafeArray,arr,服务项目,数据,传输方式,sfArrObj,srcDataLen,safeArr,COM
From: https://www.cnblogs.com/eternalmoonbeam/p/17814458.html

相关文章

  • C#学习之ListBox,ComboBox,CheckListBox
    ListBox(文本列表)常用属性:Items:描述:ListBox中的项列表。默认值:空用法:可以使用Add(),AddRange(),Insert(),Remove(),Clear(),等方法来对Items集合进行管理。SelectedIndex:描述:ListBox中当前选择项的索引。默认值:-1(表示没有选中项)用法:通过设置或读取该属......
  • Paper Reading: A hybrid deep forest-based method for predicting synergistic drug
    目录研究动机文章贡献本文工作数据集构建ForSyn模型RF-CUS单元ETF-DR单元实验结果对比实验调参实验消融实验湿实验可解释性分析与预测过程的关联特征贡献度关键特征的生物学分析优点和创新点PaperReading是从个人角度进行的一些总结分享,受到个人关注点的侧重和实力所限,可能......
  • Pset_BuildingStoreyCommon
    Pset_BuildingStoreyCommonBuildingStoreyCommon:IfcBuildingStore所有实例定义的公共属性。请注意,几个建筑属性是在IfcBuildingStorey实例中直接处理的,建筑层数(或短名称)由IfcBuildngStore.name处理,建筑层名称(或长名称)由IFcBuildingStore.LongName处理,描述(或注释)由IccBuildingSt......
  • 2023-8-24 Quantom Computational Advantage Using Pertons 光量子计算优越性 2023人
    QuantomComputationalAdvantageUsingPertons光量子计算优越性|2023人工智能大会青年科学家论坛钟瀚森上海人工智能实验室论文背景:量子计算有望在许多重要任务上实现超越经典的计算能力。但长期以来受限于实验技术,无法在实际任务上演示超越经典计算机的性能。论文成......
  • ERROR 1044 (42000) ERROR 1142 (42000): SELECT command denied to user ''@'localho
    ERROR:Accessdeniedforuser'root'@'localhost'(usingpassword:NO)   发现:   mysql-uroot@localhost-p成功   mysql-uroot-p失败   mysql>SELECTuser,hostFROMmysql.user;   ERROR1142(42000):SELECTcommanddeniedtouser&......
  • 配置使用百度地图时出现:APP Referer校验失败。请检查该ak设置的白名单与访问所有的域
    如果是个人内部测试使用,直接将IP白名单设置为*  ......
  • Python_pytest +文件名,报错—— zsh: command not found: pytest
     原因:由于“通过pip安装pytest不会使其成为系统命令,而是会将其安装到python”“-m命令将pytest作为其自己的命令运行,然后任何后续脚本都将作为参数。”解决:所以我们在命令窗口执行时应该在.py文件所在路径下执行  python-mpytest-vtest_wework.py这个问题终于......
  • [Listen][Download] Harry Potter Audiobooks Complete Series – All Harry Potter A
    HarryPotterAndTheCursedChild(#8inSeries)WrittenbyJKRowling在线音频,英文语音,mp3https://audiobookslab.com/harry-potter-and-the-cursed-child-audiobook/ ThePhilosopher’sStone(1997)TheChamberofSecrets(1998)ThePrisonerofAzkaban(1999)TheGoble......
  • 异常Couldn’t connect to host, port: smtp.qq.com, 25
    com.sun.mail.util.MailConnectException:Couldn’tconnecttohost,port:smtp.qq.com,25;timeout-1阿里云处于安全考虑,TCP25端口默认被封禁。可以向阿里云申请解封,也可以改为ssl加密465端口发送。465端口发送主要代码:Propertiesprops=newProperties();props.......
  • linux 中top命令显示完整的command
    命令比较长时,显示不全(全称,全名),可以用top-c  ......