前文:本文WINDOW平台下,用C++或C#实现共享内存。合计四个帖子,这是其中之一
××××
正文开始之前,有必要说明一下,在C#语境下, 只有双方(读方 或写方)对物理内存的占用都结束了, 物理内存才会被Window系统释放
×××
写入共享内存的程序
using System;
using System.IO;
using System.IO.MemoryMappedFiles;
using System.Threading;
namespace Memory_Write
{
class Program
{
static void Main(string[] args)
{
using (MemoryMappedFile mmf = MemoryMappedFile.CreateOrOpen("lipan", 1024000, MemoryMappedFileAccess.ReadWrite))
{
using (MemoryMappedViewStream stream = mmf.CreateViewStream())
{
var writer = new BinaryWriter(stream);
for (int i = 0; i < 500; i++)
{
writer.Write(i);
Console.WriteLine("{0}位置写入流:{0}", i);
Thread.Sleep(100);
}
Console.Read();
}
}
Console.Read();
}
}
}
读取共享内存的程序
using System;
using System.IO;
using System.IO.MemoryMappedFiles;
using System.Threading;
namespace Memory_Read
{
class Program
{
static void Main(string[] args)
{
using (MemoryMappedFile mmf = MemoryMappedFile.CreateOrOpen("lipan", 1024000, MemoryMappedFileAccess.ReadWrite))
{
using (MemoryMappedViewStream stream = mmf.CreateViewStream())
{
var reader = new BinaryReader(stream);
for (int i = 0; i < 500; i++)
{
Console.WriteLine("{1}位置:{0}", reader.ReadInt32(), i);
Thread.Sleep(10);
}
}
}
Console.Read();
}
}
}
×××××
必要的说明:
1)代码中使用了 using 语法,这个不关键, 不会的人可以自行搜索
2)重点是读和写。在测试过程中,我发现 writer.Write(i);不是覆盖写入,而是在前一个写入的下面写入,读取也是类似的,这个非常诡异
3)读代码里面
修改了i变成1,效果如下
这说明一个非常扯蛋地方:reader.ReadInt32() ,他读取物理内存的位置,是通过次数来实现的, 从头开始读取。
同时也说明writer.Write(i); ,也是无法指定写入物理内存的位置,而是通过次数来实现的。
××
4)BinaryWriter和BinaryReader(二进制文件的读写)
这两个函数,不是共享内存独有的。 读写文件的时候,也可以用这两个函数
5)
BinaryWriter和BinaryReader(二进制文件的读写)_起个名字好难啊-CSDN博客
这个链接讲解了具体的指定字节读写方式
6)下面是指定读取字节的起始位置
BinaryWriter.Seek(Int32, SeekOrigin) 方法 (System.IO) | Microsoft Docs
运行效果
7)指定写入流位置
writer.Seek(4, SeekOrigin.Begin);//指定写入位置
writer.Write(22);//将内容写入
××
×××
终于可以自由实现的 读写了!!