c# 与 c++ 内存共享
c# 与 c++ 内存共享
·
c++
// main.cpp
#include <windows.h>
#include <iostream>
#include <stdint.h>
using namespace std;
#define BUF_SIZE 1024
int main(int argc, TCHAR* argv[])
{
// 定义共享数据
//char szBuffer[] = "Hello Shared Memory";
float szBuffer[] = { 1,2,3,4,5,6,7,8,9,10 };
/* char szBuffer2[40] = { 0 };
memcpy(szBuffer2, szBuffer, 40);*/
// 创建共享文件句柄
HANDLE hMapFile = CreateFileMapping(
INVALID_HANDLE_VALUE, // 物理文件句柄
NULL, // 默认安全级别
PAGE_READWRITE, // 可读可写
0, // 高位文件大小
BUF_SIZE, // 地位文件大小
L"global_share_memory1" // 共享内存名称
);
// 映射缓存区视图 , 得到指向共享内存的指针
LPVOID lpBase = MapViewOfFile(
hMapFile, // 共享内存的句柄
FILE_MAP_ALL_ACCESS, // 可读写许可
0,
0,
BUF_SIZE
);
// 将数据拷贝到共享内存
#pragma warning(suppress : 4996)
memcpy((char*)lpBase, szBuffer, sizeof(szBuffer));
cout << "存放入共享内存的数据:" << (char*)lpBase << endl;
// 解除文件映射
UnmapViewOfFile(lpBase);
system("pause"); //等待其他进程读取数据
// 关闭内存映射文件对象句柄,只要不关闭共享内存的句柄,此进程还在,其他进程就可以读取共享内存。
//CloseHandle(hMapFile);
return 0;
}
#include <iostream>
#include <windows.h>
using namespace std;
int main()
{
LPVOID pBuffer;
string strMapName("global_share_memory1");
HANDLE hMap = OpenFileMapping(FILE_MAP_ALL_ACCESS, 0, L"global_share_memory1");
if (NULL == hMap)
{
cout << "无共享内存..." << endl;
}
else
{
float sline[10] = {0};
while (true)
{
Sleep(1000);
pBuffer = MapViewOfFile(hMap, FILE_MAP_ALL_ACCESS, 0, 0, 0);
memcpy(sline, pBuffer, sizeof(sline));
cout << "读取共享内存数据:" << sline[0] << endl;
}
}
}
C#
using System;
using System.Collections.Generic;
using System.IO;
using System.IO.MemoryMappedFiles;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
namespace cs_share
{
class Program
{
//static void Main(string[] args)
//{
// //定义内存大小
// int size = 1024;
// //创建共享内存
// MemoryMappedFile shareMemory = MemoryMappedFile.CreateOrOpen("global_share_memory1", size);
// Console.WriteLine("创建共享内存完成...");
// //线程等待10秒
// System.Threading.Thread.Sleep(10000);
// var stream = shareMemory.CreateViewStream(0, size);
// string value = "Hello World";
// byte[] data = System.Text.Encoding.UTF8.GetBytes(value);
// stream.Write(data,0, data.Length);
// stream.Dispose();
// Console.ReadKey();
//}
static void Main(string[] args)
{
using (MemoryMappedFile mmf = MemoryMappedFile.OpenExisting("global_share_memory1"))
{
//Mutex mutex = Mutex.OpenExisting("IPC_MAP_MUTEX");
// 等待写入完成
//mutex.WaitOne();
for (int j = 0; j < 10; j++)
{
using (MemoryMappedViewStream stream = mmf.CreateViewStream())
{
BinaryReader sr = new BinaryReader(stream);
byte[] buffer = new byte[40];
int ui = sr.Read(buffer, 0, buffer.Length);
float[] floatArr = new float[buffer.Length / 4];
第一种方法,字节数组转换类转换,最容易想到和处理
第二种方法,缓存复制--最为简洁
Buffer.BlockCopy(buffer, 0, floatArr, 0, buffer.Length);
//for (int i = 0; i < floatArr.Length; i++)
//{
// floatArr[i] = buffer[i * 4] | buffer[i * 4 + 1] << 8 | buffer[i * 4 + 2] << 16 | buffer[i * 4 + 3] << 24;
//}
// 读取进程 A 写入的内容
//Console.WriteLine($"recv:: {}");
System.Threading.Thread.Sleep(1000);
}
}
//mutex.ReleaseMutex();
}
Console.ReadLine();
}
}
}
更多推荐
所有评论(0)