博客
关于我
STS 的共享内存过程(待充分理解)
阅读量:645 次
发布时间:2019-03-15

本文共 3529 字,大约阅读时间需要 11 分钟。

一、开启模块运算共享内存

在系统运行过程中,首先需要初始化模块运算共享内存。以下是详细的代码实现步骤:

void CSupportSystemDoc::SetUpShareMemory(){ ShareMemNameOutData = "REALTIMEDATA"; HFileMapOutData = CreateFileMapping((HANDLE)0xFFFFFFFF, (LPSECURITY_ATTRIBUTES)NULL, PAGE_READWRITE, 0, MAX_SHARELIMIT, ShareMemNameOutData);

PtrShareMemOutData = (char*)MapViewOfFile(HFileMapOutData,FILE_MAP_ALL_ACCESS,0,0,MAX_SHARELIMIT);

m_bCreateMem = TRUE;memset(PtrShareMemOutData, 0, MAX_SHARELIMIT);


二、向共享内存中载入数据

通过代码中定义的CLnObjList类和相关变量,系统能够有效地管理和操作算法对象链表。在实际应用中,以下步骤是必要的:

CLnObjList m_objects; // 存储所有算法对象CLnObjList m_CalculateList; // 运算时用于挑选模块组成新的链表CLnObjList m_tCalculateList; // 临时运算链表,用于载入初始条件

void CSupportSystemDoc::SetShareMemoryData(){CLnObjList m_tempList; // 查找条件中未涉及到的模块m_tempList.RemoveAll();

char* pPointer;POSITION pos = m_objects.GetHeadPosition();while (NULL != pos){CLnObj* pObj = m_objects.GetNext(pos);POSITION t_pos = m_tCalculateList.GetHeadPosition();while (NULL != t_pos){CLnObj* t_pObj = m_tCalculateList.GetNext(t_pos);if ((pObj->Module_Count == t_pObj->Module_Count) &&(pObj->Alg_Fun == t_pObj->Alg_Fun) &&(pObj->Module_Count != 0)){pObj->Cycles = t_pObj->Cycles;

int i = 0;for (i = 0; i < t_pObj->inNum; i++){pPointer = (char*)PtrShareMemOutData + pObj->Point

  • MAX_STRINGLENGTH + INT_LENGTH + INT_LENGTH
  • (MAX_STRINGLENGTH + CHAR_LENGTH + DOUBLE_LENGTH)*i
  • MAX_STRINGLENGTH;

// 读取输入状态((unsigned char)pPointer) = t_pObj->InState[i];pPointer += sizeof(unsigned char);

// 读取输入实时值if (t_pObj->pInputName[i] == pObj->pInputName[i]){((double)pPointer) = t_pObj->InData[i];pPointer += sizeof(double);pObj->InData[i] = t_pObj->InData[i];}else{pPointer += sizeof(double);}

// 写入常数值for (i = 0; i < t_pObj->cofNum; i++){pPointer = (char*)PtrShareMemOutData

  • pObj->Point
  • MAX_STRINGLENGTH + INT_LENGTH + INT_LENGTH
  • (MAX_STRINGLENGTH + CHAR_LENGTH + DOUBLE_LENGTH)*pObj->inNum
  • (MAX_STRINGLENGTH + CHAR_LENGTH + DOUBLE_LENGTH)*i
  • MAX_STRINGLENGTH;

// 写入输出状态((unsigned char)pPointer) = t_pObj->OutState[i];pPointer += sizeof(unsigned char);

// 写入输出实时值if (pObj->pOutputName[i] == t_pObj->pOutputName[i]){((double)pPointer) = t_pObj->OutData[i];pPointer += sizeof(double);pObj->OutData[i] = t_pObj->OutData[i];}else{pPointer += sizeof(double);}}break;}

if (Bfind == FALSE && pObj->Module_Count != 0){m_tempList.AddTail(pObj);}

Bfind = FALSE;}


三、系统运行中的数据处理

在系统的实际运行过程中,模块状态的处理需要特别注意以下几点:

if (1){ POSITION pos = m_tempList.GetHeadPosition(); while (NULL != pos){ CLnObj* pObj = m_tempList.GetNext(pos);

int i = 0;for (i = 0; i < pObj->inNum; i++){if (0 != pObj->inRect[i]){t_Point = (char*)PtrShareMemOutData + pObj->m_InPoint[i];t_InData = (double)t_Point;

t_Point = (char*)PtrShareMemOutData

  • pObj->Point
  • MAX_STRINGLENGTH + INT_LENGTH + INT_LENGTH
  • (MAX_STRINGLENGTH + CHAR_LENGTH + DOUBLE_LENGTH)*i
  • MAX_STRINGLENGTH + 1;((double)t_Point) = t_InData;}else if (0 == pObj->inRect[i]){if (pObj->m_InType[i] == 2 && pObj->m_InPoint[i] != 0){t_Point = (char*)PtrShareMemOutData + pObj->m_InPoint[i];t_InData = (double)t_Point;

t_Point = (char*)PtrShareMemOutData

  • pObj->Point
  • MAX_STRINGLENGTH + INT_LENGTH + INT_LENGTH
  • (MAX_STRINGLENGTH + CHAR_LENGTH + DOUBLE_LENGTH)*i
  • MAX_STRINGLENGTH + 1;((double)t_Point) = t_InData;}else{t_Point = (char*)PtrShareMemOutData + pObj->Point
  • MAX_STRINGLENGTH + INT_LENGTH + INT_LENGTH
  • (MAX_STRINGLENGTH + CHAR_LENGTH + DOUBLE_LENGTH)*i
  • MAX_STRINGLENGTH + 1;if (pObj->pInputName[i] == ""){((double)t_Point) = 0;}}}

重要说明

以上代码实现基于模块运算的共享内存机制,适用于在多个程序或多线程环境中共享数据。在实际应用中,需要注意以下几点:

  • 确保共享内存的安全性和互斥性,避免数据竞争和不一致性。
  • 及时处理异常情况,如共享内存泄漏或不一致状态。
  • 优化数据读写操作,避免盲目增加内存占用,影响系统性能。
  • 转载地址:http://vuumz.baihongyu.com/

    你可能感兴趣的文章
    JavaSE总结
    查看>>
    手动造轮子——基于.NetCore的RPC框架DotNetCoreRpc
    查看>>
    Python IO编程
    查看>>
    CSS入门总结
    查看>>
    使用 TortoiseGit 时,报 Access denied 错误
    查看>>
    基于 HTML5 WebGL 的污水处理厂泵站自控系统
    查看>>
    django-表单之模型表单渲染(六)
    查看>>
    c++之程序流程控制
    查看>>
    spring-boot-2.0.3之redis缓存实现,不是你想的那样哦!
    查看>>
    有道云笔记 同步到我的博客园
    查看>>
    李笑来必读书籍整理
    查看>>
    Hadoop(十六)之使用Combiner优化MapReduce
    查看>>
    《机器学习Python实现_10_06_集成学习_boosting_gbdt分类实现》
    查看>>
    CoreCLR源码探索(八) JIT的工作原理(详解篇)
    查看>>
    andriod 开发错误记录
    查看>>
    C语言编译错误列表
    查看>>
    看明白这两种情况,才敢说自己懂跨链! | 喵懂区块链24期
    查看>>
    CentOS5 Linux编译PHP 报 mysql configure failed 错误解决办法
    查看>>
    pycharm新建文件夹时新建python package和新建directory有什么区别?
    查看>>
    python中列表 元组 字典 集合的区别
    查看>>