2017-03-06 28 views
1

Python 스크립트로 작성된 C# 응용 프로그램에서 값을 읽으려는 Python과 C# 사이의 프로세스 간 통신을 원합니다.메모리 매핑 된 파일 값이 읽기 액세스 후 0으로 설정됩니다.

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); 

그것은 성공적으로 값을 읽지 만 그 후 0으로 메모리 매핑 된 파일의 값을 설정합니다 는 C#에서, 나는 메모리 맵 파일 클래스를 사용하고 있습니다. 따라서 메모리 맵핑 된 파일을 다시 읽으면 (그리고 아직 파이썬 스크립트로 덮어 쓰지 않았다면), 나는 단지 0을 읽게 될 것입니다. 어떻게 방지 할 수 있습니까?

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

당신이 비 Pesisted 메모리 맵 파일을 사용하는 .CreateOrOpen를 사용하고 있기 때문에 GC의 의미 내용

를 GC는 무료입니다 (https://msdn.microsoft.com/en-us/library/dd997372(v=vs.110).aspx 참조) 다음과 같이

내 파이썬 스크립트 보인다

나머지 코드에 대해서는 약간의 가정을하고 있지만 CreateOrOpen과 단일 메서드로 읽는 것처럼 보이므로 GC는 읽기가 끝난 후 즉시 내용을 처리 할 수 ​​있습니다. 기본적으로 C# 응용 프로그램 메모리입니다. 소유하고 GCed됩니다 정상적으로.

응용 프로그램 시작시 또는 적절한 '세션'개체에서 열리 며 (참조 된) 즉, .CreateFromFile으로 이동하면 A의 광범위한 컨텍스트에서 .CreateOrOpen 중 하나가 필요합니다. 필요하다면 처음부터 약간의 수동 제로/적절한).

TLDR; mmfSimPro은 app/class 수준에서 로컬 변수가 아닌 필드에 보관해야하므로 app/class 수명 및 읽기 메서드의 길이에 대한 라이브 GC 핸들이 있습니다.