gpt4 book ai didi

c# - 读访问后内存映射文件值设置为零

转载 作者:太空宇宙 更新时间:2023-11-03 15:34:38 26 4
gpt4 key购买 nike

我想实现 Python 和 C# 之间的进程间通信,以便读取由 Python 脚本编写的 C# 应用程序中的值。在 C# 中,我使用 MemoryMappedFile 类:

MemoryMappedFile mmfSimPro = MemoryMappedFile.CreateOrOpen("MyFileMappingObject_SimPro", 20);
MemoryMappedViewAccessor accessorAxesSimPro = mmfSimPro.CreateViewAccessor(0, 20);
for (int i = 0; i < axesSimPro.Length; i++)
axesSimPro[i] = accessorAxesSimPro.ReadSingle(sizeof(float) * i);

它成功读取值,但之后它将内存映射文件中的值设置为零。因此,如果我再次读取内存映射文件(并且它尚未被 Python 脚本覆盖),我将只读取零。我怎样才能防止这种情况发生?

我的 python 脚本如下所示:

def WriteAxes():
shmem = mmap.mmap(0,256, "MyFileMappingObject_SimPro",mmap.ACCESS_WRITE)
struct.pack_into('f',shmem,0,_ctrl.Joints[1].CurrentValue)
struct.pack_into('f',shmem,4,_ctrl.Joints[0].CurrentValue)
struct.pack_into('f',shmem,8,_ctrl.Joints[2].CurrentValue)
struct.pack_into('f',shmem,12,_ctrl.Joints[3].CurrentValue)
struct.pack_into('f',shmem,16,_ctrl.Joints[4].CurrentValue-90)
shmem.close()

最佳答案

由于您使用的是.CreateOrOpen,因此您正在使用非Pesisted MemoryMappedFile(请参阅https://msdn.microsoft.com/en-us/library/dd997372(v=vs.110).aspx)这意味着GC可以自由地GC内容

我对你的代码的其余部分做了一些假设,但看起来你 CreateOrOpen 并在一个方法中读取,因此一旦你读完,GC 就可以自由地处理内容,基本上这是你的一些内存C# 应用程序拥有它,它将像平常一样被 GC。

您需要在 A 的某个更广泛的上下文中进行 .CreateOrOpen (即在应用程序启动时或在任何适当的“ session ”对象中打开(并保持引用))或移动到 .CreateFromFile 将其视为持久的(如果需要/适当的话,可能会在开始时进行一些手动清零)。

TLDR; mmfSimPro 可能应该保存在应用程序/类级别的字段中,而不是本地变量中,因此它具有用于应用程序/类生命周期的实时 GC 句柄,而不仅仅是读取方法的长度。

关于c# - 读访问后内存映射文件值设置为零,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42623424/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com