首页 > 系统相关 >一个共享内存管理的类

一个共享内存管理的类

时间:2025-01-10 10:56:49浏览次数:1  
标签:INDEX mIndexes return 管理 一个 else int error 共享内存

一个用于内存管理分块的代码

/* mIndexes 位置说明: 3是取结果的位置,2写的结果的位置,1是取图片的位置,0是放图片位置*/ /* mIndexes 其他位置*/ #define WIDTH_INDEX 10 // 图片宽度 // #define HEIGHT_INDEX (WIDTH_INDEX + 1) // 图片高度 // #define IMAGE_FORMAT_INDEX (WIDTH_INDEX + 2) // 图片格式 // #define IMAGE_SNAP_WRITE_INDEX (WIDTH_INDEX + 3) // 获取单张图片设置标准位 // #define IMAGE_SNAP_READ_INDEX (WIDTH_INDEX + 4) // 获取单张图片读取标准位 // #define IMAGE_SERIES_WRITE_RESULT (WIDTH_INDEX + 5) /* 正在连续写图片结果 */ #define IMAGE_SERIES_READ_RESULT (WIDTH_INDEX + 6) /* 正在连续读图片结果 */ #define HEADER_SIZE_UNIT (1024 * 64) /*最大的size*/ #define HEADER_RATE (4) /**/ #define DATA_START_UNIT (1024) class ImageShareBuffer { public: struct ShareBuffe { string memfile; int dataStart; int blockcount; int headersize; int width; int height; int format; }; class DataBlock { public: void* dataptr; void* infoptr; int blocksize; int position; }; static ImageShareBuffer* create(const char* configfile) { int error = 0; ImageShareBuffer* is = new ImageShareBuffer(); if (is->load(configfile) == 0) { if (is->createHost() == 0) { is->init(1); } else error = -2; } else error = -1; if (!error) return is; else { delete is; return nullptr; } } static ImageShareBuffer* create(const ShareBufferInfo info) { int error = 0; ImageShareBuffer* is = new ImageShareBuffer(); is->datastart = info.dataStart; is->blockcount = info.blockcount; is->headersize = info.headersize; is->width = info.width; is->height = info.height; is->format = info.format; is->memfile = info.memfile; is->dPix = 1; if (!error) return is; else { delete is; return nullptr; } } static ImageShareBuffer* open(const char* configfile) { int error = 0; ImageShareBuffer* is = new ImageShareBuffer(); if (is->load(configfile) == 0) { if (is->openClient() == 0) { is->init(); } else error = -2; } else error = -1; if (!error) return is; else { delete is; return nullptr; } } static ImageShareBuffer* open(const ShareBufferInfo info) { int error = 0; ImageShareBuffer* is = new ImageShareBuffer(); is->datastart = info.dataStart; is->blockcount = info.blockcount; is->headersize = info.headersize; is->width = info.width; is->height = info.height; is->format = info.format; is->memfile = info.memfile; is->dPix = 1; if (is->format == IMAGE_FORMAT_RGB888) // 1彩色;0,2,3灰色 { is->dPix = 3; // RGB } if (is->format == 4) { is->dPix = 8; } if (is->openClient() == 0) { is->init(); } else error = -2; if (!error) return is; else { delete is; return nullptr; } } static ImageShareBuffer* createMap2(const char* configfile) { int error = 0; ImageShareBuffer* is = new ImageShareBuffer(); if (is->load(configfile) == 0) { if (is->createMap() == 0) { is->init(); } else error = -2; } else error = -1; if (!error) return is; else { delete is; return nullptr; } } int position(int sectionid = 0) { return mIndexes[sectionid]; } void setdata(int data, int index = 1) { if (index > 1024 || index < 0) { cout << "setdata out of 0~1024 rect: " << index << endl; return; } mIndexes[index] = data; } int size(int sectionid = 0) { int max = mDataBlocks.size(); if (mIndexes[sectionid] < max) return mIndexes[sectionid]; else return max - 1; } DataBlock* get(int pos) { if (pos >= 0) { int max = mDataBlocks.size(); int ind = pos % max; mDataBlocks[ind].position = pos; return &mDataBlocks[ind]; } return 0; } int commit(DataBlock* db, int sectionid = 0) { int position = db->position; mIndexes[sectionid] = position + 1; return 0; } int maxBufferCnt() { return mDataBlocks.size(); } ~ImageShareBuffer() { releaseMap(); } inline void activate() { *mActiveTime = GetTickCount(); } int getSnapWriteFlag() { return mIndexes[IMAGE_SNAP_WRITE_INDEX]; } void setSnapWriteFlag(int flag) { mIndexes[IMAGE_SNAP_WRITE_INDEX] = flag; } int getSnapReadFlag() { return mIndexes[IMAGE_SNAP_READ_INDEX]; } void setSnapReadFlag(int flag) { mIndexes[IMAGE_SNAP_READ_INDEX] = flag; } int getSeriesWriteFlag() { return mIndexes[IMAGE_SERIES_WRITE_RESULT]; } void setSeriesWriteFlag(int flag) { mIndexes[IMAGE_SERIES_WRITE_RESULT] = flag; } int getSeriesReadFlag() { return mIndexes[IMAGE_SERIES_READ_RESULT]; } void setSeriesReadFlag(int flag) { mIndexes[IMAGE_SERIES_READ_RESULT] = flag; } public: int width; int height; int dPix; int blockcount; int headersize; int datastart; int format; string memfile; private: ImageShareBuffer() {} int init(int host = 0) { mActiveTime = ( long long* )mShareMemoryPointer; mIndexes = ( int* )mShareMemoryPointer + 2; if (host == 1) { memset(mIndexes, 0, datastart * DATA_START_UNIT - 2 * sizeof(int)); mIndexes[WIDTH_INDEX] = width; mIndexes[HEIGHT_INDEX] = height; mIndexes[IMAGE_FORMAT_INDEX] = dPix; mIndexes[IMAGE_SNAP_WRITE_INDEX] = 0; mIndexes[IMAGE_SNAP_READ_INDEX] = 7; } char* base = ( char* )mShareMemoryPointer + datastart * DATA_START_UNIT; for (int i = 0; i < blockcount; i++) { DataBlock db; db.infoptr = base; db.dataptr = ( void* )(base + headersize * HEADER_SIZE_UNIT); // db.blocksize = headersize * HEADER_SIZE_UNIT + width * height * dPix; db.blocksize = headersize * HEADER_SIZE_UNIT + getImageBufLen(); db.position = -1; mDataBlocks.push_back(db); base += db.blocksize; } return 0; } HANDLE mHandle; void* mShareMemoryPointer; // 首地址 // nlohmann::json mConfig; vector<DataBlock> mDataBlocks; long long* mActiveTime; int* mIndexes; int openClient() { int error = 0; mHandle = OpenFileMappingA(FILE_MAP_ALL_ACCESS, FALSE, memfile.c_str()); if (mHandle != NULL) { mShareMemoryPointer = MapViewOfFile(mHandle, FILE_MAP_ALL_ACCESS, 0, 0, 0); if (mShareMemoryPointer == NULL) error = -2; } else error = -1; if (error) cout << "open client fail: " << error << endl; return error; } int loadParam() { try { datastart = mConfig["datastart"]; blockcount = mConfig["blockcount"]; headersize = mConfig["headersize"]; width = mConfig["width"]; height = mConfig["height"]; format = mConfig["format"]; memfile = mConfig["memfile"]; dPix = 1; if (format == IMAGE_FORMAT_RGB888) // 1彩色;0,2,3灰色 { dPix = 3; // RGB } return 0; } catch (...) { return -1; } } int createHost() { int error = 0; // DWORD size = datastart * DATA_START_UNIT + blockcount * (headersize * HEADER_SIZE_UNIT + width * height * dPix); // int64_t big = int64_t(datastart * DATA_START_UNIT) + blockcount * int64_t(headersize * HEADER_SIZE_UNIT + width * height * dPix); int64_t big = int64_t(datastart * DATA_START_UNIT) + blockcount * int64_t(headersize * HEADER_SIZE_UNIT + getImageBufLen()); DWORD high = (big & 0xffffffff00000000) >> 32; DWORD low = big & 0x00000000ffffffff; mHandle = CreateFileMappingA(INVALID_HANDLE_VALUE, NULL, PAGE_READWRITE, high, low, memfile.c_str()); if (mHandle != NULL) { mShareMemoryPointer = MapViewOfFile(mHandle, FILE_MAP_ALL_ACCESS, 0, 0, 0); if (mShareMemoryPointer == NULL) error = -2; else { memset(mShareMemoryPointer, 0, datastart); } } else { error = -1; } if (error) { cout << "create host fail: " << error << endl; int last = GetLastError(); cout << "GetLastError: " << last << endl; // ERROR_INVALID_HANDLE //6,如果发现你的命名内存空间和现有的内存映射,互斥量,信号量,临界区同名就麻烦了 // ERROR_NOT_ENOUGH_MEMORY //8,内存不足 // ERROR_ALREADY_EXISTS //183,表示内存空间命名已经存在 // ERROR_FILE_INVALID //1006,企图创建一个零长度的文件映射 // ERROR_NO_SYSTEM_RESOURCES //1450,资源不足 // ERROR_COMMITMENT_LIMIT //1455,页文件太小 } return error; } int createMap() { int error = 0; // DWORD size = datastart * DATA_START_UNIT + blockcount * (headersize * HEADER_SIZE_UNIT + width * height * dPix); // int64_t big = int64_t(datastart * DATA_START_UNIT) + blockcount * int64_t(headersize * HEADER_SIZE_UNIT + width * height * dPix); int64_t big = int64_t(datastart * DATA_START_UNIT) + blockcount * int64_t(headersize * HEADER_SIZE_UNIT + getImageBufLen()); DWORD high = (big & 0xffffffff00000000) >> 32; DWORD low = big & 0x00000000ffffffff; // LARGE_INTEGER *n = (LARGE_INTEGER *)&big; // DWORD high1 = n->HighPart; // DWORD low1 = n->LowPart; // 创建共享内存// mHandle = CreateFileMappingA(INVALID_HANDLE_VALUE, NULL, PAGE_READWRITE, high, low, memfile.c_str()); if (mHandle != NULL) { mShareMemoryPointer = MapViewOfFile(mHandle, FILE_MAP_ALL_ACCESS, 0, 0, 0); if (mShareMemoryPointer == NULL) error = -2; else { memset(mShareMemoryPointer, 0, datastart); } } else { // 创建失败打开共享内存// mHandle = OpenFileMappingA(FILE_MAP_ALL_ACCESS, FALSE, memfile.c_str()); if (mHandle != NULL) { mShareMemoryPointer = MapViewOfFile(mHandle, FILE_MAP_ALL_ACCESS, 0, 0, 0); if (mShareMemoryPointer == NULL) error = -2; } else { error = -1; } } if (error) { cout << "create host fail: " << error << endl; int last = GetLastError(); cout << "GetLastError: " << last << endl; // ERROR_INVALID_HANDLE //6,如果发现你的命名内存空间和现有的内存映射,互斥量,信号量,临界区同名就麻烦了 // ERROR_NOT_ENOUGH_MEMORY //8,内存不足 // ERROR_ALREADY_EXISTS //183,表示内存空间命名已经存在 // ERROR_FILE_INVALID //1006,企图创建一个零长度的文件映射 // ERROR_NO_SYSTEM_RESOURCES //1450,资源不足 // ERROR_COMMITMENT_LIMIT //1455,页文件太小 } return error; } void releaseMap() { if (mShareMemoryPointer != NULL) UnmapViewOfFile(mShareMemoryPointer); mShareMemoryPointer = NULL; if (mHandle) CloseHandle(mHandle); mHandle = NULL; } int load(const char* jsonfile) { try { ifstream(jsonfile) >> mConfig; int res = loadParam(); return res; } catch (...) { return -1; } } public: int getImageBufLen(void) { int step = 0; if (dPix == 1) { step = calcBytesPerLine(width, 8); } else if (dPix == 3) { step = calcBytesPerLine(width, 24); } else if (dPix == 8) { step = calcBytesPerLine(width, 64); } int len = step * height; return len; } private: int calcBytesPerLine(int width, int bitCounts) { int step = 0; if (bitCounts >= 8) { step = (width * bitCounts / 8 + 3) / 4 * 4; } else { step = (width * bitCounts + 31) / 32 * 4; } return step; } };

  

标签:INDEX,mIndexes,return,管理,一个,else,int,error,共享内存
From: https://www.cnblogs.com/dwx-bzdcxy/p/18663577

相关文章

  • 从 bcp 客户端收到一个对 colid x 无效的列长度。
    出现场景:批量插入数据的时候出现这个问题。原因分析:某个数据的长度应该是大于这个数据对应的列的定义长度。所以一一检查到底是那个列的长度超出了。第一种方法:从bcp客户端收到一个对colidx无效的列长度。colidx是多少说明是第x+1列出了问题,比如colid1说明是第二列。......
  • 基于JAVA中的spring框架和jsp实现门禁管理系统项目【内附项目源码+论文说明】
    摘要门禁管理系统主要用在了企业中,职工可以通过门禁进行通道的访问和通过,管理员可以对企业员工进行门禁的限制,通道可以限定通过的时间和日期,也能对某个特种用户进行限制通行,所以基与互联网的门禁管理系统也就孕育而生了。门禁管理系统就是能够使学生通过互联网完成毕业设计......
  • JAVA开源免费项目 基于Vue和SpringBoot的常规应急物资管理系统(附源码)
    本文项目编号T159,文末自助获取源码\color{red}{T159,文末自助获取源码}......
  • SSM运动会信息管理系统-毕业设计源码39439
    摘要本论文基于SSM框架,设计和实现了一个运动会信息管理系统。该系统旨在提供一个全面、高效的运动会信息管理平台,以便组织者可以方便地进行各项管理工作,并提供给参与者及时准确的比赛信息。  该系统通过角色划分为运动员用户和管理员两个角色,其中运动员具有以下主要功能......
  • 基于Springboot+Uniapp的学生宿舍管理微信小程序设计与实现
    ......
  • 体育馆管理系统(代码+数据库+LW)
    摘 要现代经济快节奏发展以及不断完善升级的信息化技术,让传统数据信息的管理升级为软件存储,归纳,集中处理数据信息的管理方式。本体育馆管理系统就是在这样的大环境下诞生,其可以帮助管理者在短时间内处理完毕庞大的数据信息,使用这种软件工具可以帮助管理人员提高事务处理效率......
  • 从 0 到 1:实现一个基于零知识证明的寻宝游戏
    作者:hello2jie本教程指导你使用Minao1js 开发一个去中心化应用(DApp),构建一个基于零知识证明(ZKP)的寻宝游戏。游戏中,玩家扮演精英盗贼,需完成一系列盗宝任务。通过零知识证明,玩家可以向系统展示任务完成的真实性,同时保护任务细节(如密码、路线或地点等)。整个游戏采用去中心......
  • 给定一个字符串,对该字符串进行删除操作,保留 k 个字符且相对位置不变,使字典序最小
    这是一个经典的编程问题,可以用单调栈的方法高效解决。以下是解题步骤和代码实现:问题描述给定一个字符串s和一个整数k,要求删除字符串中的一些字符,最终保留k个字符,且相对顺序不变,使得结果字符串字典序最小。解题思路单调栈维护最小字典序:使用一个栈来维护当前......
  • JSP剧本杀信息管理系统6n84v程序+源码+数据库+调试部署+开发环境
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容一、项目背景与意义随着剧本杀游戏的迅速普及,越来越多的玩家、创作者和商家参与到这一社交娱乐活动中。然而,传统的剧本管理方式存在诸多不足,如剧本......
  • JSP开放实验室预约管理系统2118f--(程序+源码+数据库+调试部署+开发环境)
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容一、研究背景与意义随着教育和科研的不断发展,实验室资源的有效管理和开放共享成为重要议题。传统的人工管理方式存在效率低、资源浪费等问题,无法满......