在VB.net里面使用内存映射,无法擦除已经写入的数据。

wenluderen 2018-08-24 03:00:19
做了两个程序,一个主,一个侧。

在主里面创建两个内存映射区域。 然后从主发送数据到内存映射区域。从侧程序读取。 发现无法擦除已经写入的数据。
主程序如下:

Public Class Form1
Dim MF_PLC_TO_SCADA As System.IO.MemoryMappedFiles.MemoryMappedFile 'MemoryMappedFile 内存映射文件对象
Dim MF_SCADA_TO_PLC As System.IO.MemoryMappedFiles.MemoryMappedFile 'MemoryMappedFile 内存映射文件对象

Private Sub Form1_Load(sender As Object, e As EventArgs) Handles Me.Load
'MemoryMappedFile.CreateNew 获取表示非持久化内存映射文件的 MemoryMappedFile 对象(未与磁盘上的文件关联)
'参数1:要分配给内存映射文件的名称。
'参数2:要分配给内存映射文件的最大大小(以字节为单位)。
MF_PLC_TO_SCADA = MF_PLC_TO_SCADA.CreateNew("SYSIO_PLC_TO_SCADA", 10) '在主共享进程中创建一个非常驻的内存映射文件,其大小为5000字节
MF_SCADA_TO_PLC = MF_SCADA_TO_PLC.CreateNew("SYSIO_SCADA_TO_PLC", 10) '在主共享进程中创建一个非常驻的内存映射文件,其大小为5000字节
Me.Timer1.Interval = 500

End Sub
Private Sub Button_START_R_Click(sender As Object, e As EventArgs) Handles Button_START_R.Click
Me.Timer1.Enabled = True
End Sub
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button_SEND.Click

Dim buf(10) As Byte

Dim ms As System.IO.MemoryMappedFiles.MemoryMappedViewStream '内存映射文件的视图流

ms = MF_PLC_TO_SCADA.CreateViewStream()

Dim Gsz_S As Int32 '定义一个Int32类型的数据

Gsz_S = Me.TextBox_SEND.Text

buf = BitConverter.GetBytes(Gsz_S) '将这个数据转化为 字节数组

ms.Write(buf, 0, buf.Length) '向内存映射文件写入信息

'字节数组,从该字节数组将字节复制到当前流中
'缓冲区中的偏移量,从此处开始将字节复制到当前流中。
'要写入当前流的字节数。
End Sub
Private Sub Timer1_Tick(sender As Object, e As EventArgs) Handles Timer1.Tick
Try
Dim buf() As Byte = {0, 0, 0, 0, 0} '定义一个字节数组

Dim ms As System.IO.MemoryMappedFiles.MemoryMappedViewStream

ms = MF_SCADA_TO_PLC.CreateViewStream()

Me.TextBox_ReadView_Length.Text = ms.Length()

ReDim buf(ms.Length())

ms.Read(buf, 0, buf.Length) '读取该映射文件中的指定内容

Me.TextBox_Read.Text = BitConverter.ToInt32(buf, 0)

Catch ex As Exception
MessageBox.Show(ex.Message, Text, MessageBoxButtons.OK, MessageBoxIcon.Error)
End Try

End Sub


End Class



辅助程序如下

Public Class Form1
Dim MF_PLC_TO_SCADA As System.IO.MemoryMappedFiles.MemoryMappedFile 'MemoryMappedFile 内存映射文件对象
Dim MF_SCADA_TO_PLC As System.IO.MemoryMappedFiles.MemoryMappedFile 'MemoryMappedFile 内存映射文件对象

Private Sub Form1_Load(sender As Object, e As EventArgs) Handles Me.Load
'在系统内存中打开一个具有指定名称的现有内存映射文件。
MF_PLC_TO_SCADA = MF_PLC_TO_SCADA.OpenExisting("SYSIO_PLC_TO_SCADA") '打开一个内存中已经存在的映射,也就是主共享进程中创建的内存映射文件
MF_SCADA_TO_PLC = MF_SCADA_TO_PLC.OpenExisting("SYSIO_SCADA_TO_PLC") '打开一个内存中已经存在的映射,也就是主共享进程中创建的内存映射文件
Me.Timer1.Interval = 500
End Sub

Private Sub Button_START_R_Click(sender As Object, e As EventArgs) Handles Button_START_R.Click
Me.Timer1.Enabled = True
End Sub
#Region "接受"
Private Sub Timer1_Tick(sender As Object, e As EventArgs) Handles Timer1.Tick
Try
Dim Ms_length As Int64 = 0

Dim buf() As Byte '这是一个字节数组,用于存储从映射内存返回的数据

Dim ms As System.IO.MemoryMappedFiles.MemoryMappedViewStream '这个内存数据流

ms = MF_PLC_TO_SCADA.CreateViewStream() '给这个内存数据流赋值

Ms_length = ms.Length()

ReDim buf(Ms_length)

ms.Read(buf, 0, buf.Length) '读取该映射文件中的指定内容 将指定数量的字节读入指定的数组

Me.TextBox_R.Text = BitConverter.ToInt32(buf, 0)

Catch ex As Exception
MessageBox.Show(ex.Message, Text, MessageBoxButtons.OK, MessageBoxIcon.Error)
End Try

End Sub
#End Region

#Region "发送"
Private Sub Button_SEND_Click(sender As Object, e As EventArgs) Handles Button_SEND.Click

Dim buf(10) As Byte

Dim ms As System.IO.MemoryMappedFiles.MemoryMappedViewStream '内存映射文件的视图流

ms = MF_SCADA_TO_PLC.CreateViewStream()

Dim Gsz_S As Int32 '定义一个Int32类型的数据

Gsz_S = Me.TextBox_SEND.Text

buf = BitConverter.GetBytes(Gsz_S) '将这个数据转化为 字节数组

ms.Write(buf, 0, buf.Length) '向内存映射文件写入信息

End Sub
#End Region

End Class



使用了Dispose 也不可以
...全文
343 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
智造引领未来 2018-09-26
  • 打赏
  • 举报
回复
目前看似乎就是这个样子, 而且这个问题 也是无人可以想回答的。
wenluderen 2018-08-24
  • 打赏
  • 举报
回复


开辟映射内存的时候,我只是申请了一个1个字节。

但是我查看流程度的时候 发现是4096.

这个玩意应该就是所谓的4K对齐了

查了下资料 ,在早期似乎最小单位是512B(字节)

后来随时时代的发展。 512 明显不够了

直接升级到4096

翻了8倍

××××
这是题外话。 映射内存无法删除的事情 还是没有解决

感觉这里面似乎有个先进先出的队列。

wenluderen 2018-08-24
  • 打赏
  • 举报
回复


×××
ms.Flush() '清除此流的所有缓冲区,使得所有缓冲的数据写入到基础文件。
说是可以清除,其实无法清除
×××
ms.Dispose()

也是不行

×××
感觉MF里面的数据 似乎只可以覆盖 ,无法清除

×××

7,763

社区成员

发帖
与我相关
我的任务
社区描述
VB 基础类
社区管理员
  • VB基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧