本文共 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/