博客
关于我
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/

    你可能感兴趣的文章
    学习Vue.js2.0(国外视频教程)
    查看>>
    wxPython和PyOpenGL视频
    查看>>
    在30分钟内学习PHP
    查看>>
    Python svm 支持向量机
    查看>>
    OpenStack 最小化安装配置(一):物理机网桥配置
    查看>>
    PS快速美白照片
    查看>>
    ubuntu 16.04 镜像下载
    查看>>
    CUDA9.1、cuDNN7在Ubuntu16.04上的安装
    查看>>
    解决“预编译器错误:代码使用了scss/sass语言,但未安装相应编译器,请在菜单工具-插件安装里安装相应编译插件”
    查看>>
    微信小程序云开发:怎么删除云函数?已解决
    查看>>
    解决微信小程序项目导入的问题:app.json 未找到、 __wxConfig is not defined
    查看>>
    非迅捷|PDF、Word、PPT、Excel、图片等互相在线转换:免费、简单、快速、零错误、无套路
    查看>>
    第一次被黑
    查看>>
    PyCharm配置anaconda环境
    查看>>
    SpringBoot与缓存(JSR-107、Spring缓存抽象)
    查看>>
    ERROR 总结
    查看>>
    查找最小值栈的O(1)
    查看>>
    淘宝天猫双十一养猫组队怎么踢人
    查看>>
    Java面试题整理,闭关在家37天“吃透”这份345页PDF,纯干货
    查看>>
    概念唱片Plastic Beach封面高清壁纸
    查看>>