2017-03-06 41 views
1

我想實現Python和C#之間的進程間通信,以便讀取由我的C#應用​​程序中的Python腳本編寫的值。 在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() 

回答

1

由於您使用.CreateOrOpen您使用非Pesisted MemoryMappedFile(見https://msdn.microsoft.com/en-us/library/dd997372(v=vs.110).aspx這意味着GC是免費的GC內容

我想提出一些假設你的代碼的其餘部分,但它看起來像你CreateOrOpen並在一個單一的方法來讀取,因此,GC是免費的,只要你讀完處置的內容,基本上這是一些記憶你的C#應用​​程序擁有並將被GCed 像平常一樣。你可能需要.CreateOrOpen在更廣泛的A語境中(即它在應用程序啓動時或在任何適當的「會話」對象中打開(並保持引用)),或者移動到.CreateFromFile以將其視爲持久(可能與如果需要/適當的話,在開始時手動調零)。

TLDR; mmfSimPro可能應該在應用程序/等級,一個字段不是在一個局部變量保持,它對於應用程序/類一輩子活GC手柄,不僅爲read方法的長度。