2017-03-06 4 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); 

は、それが正常値を読み取り、それの後にそれがゼロにメモリマップされたファイル内の値を設定します。 は、C#で、私は、メモリマップトファイルのクラスを使用しています。だから私がメモリマップされたファイルをもう一度読み込んだら(まだ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

あなたは非Pesistedメモリマップトファイルを使用している.CreateOrOpenを使用しているのでGCを意味内容

をGCに自由である https://msdn.microsoft.com/en-us/library/dd997372(v=vs.110).aspxを参照してください):次のように

私のPythonスクリプトに見えます

私はコードの残りの部分についていくつかの仮定をしていますが、あなたはCreateOrOpenのように見えますし、単一のメソッドで読み込むので、GCは読み込みを終了したらすぐに内容を破棄することができます。それはGCedされます いつものように。

アプリ起動時や適切な「セッション」オブジェクトで開かれている(参照されている)か、.CreateFromFileに移動すると、永続的に表示されますそれが必要/適切である場合には、手始めにいくつかのマニュアルをゼロにする)。

TLDR; mmfSimProは、ローカル変数にないフィールドのapp/classレベルに保持されるべきであるため、readメソッドの長さだけでなく、app/classのライフタイム用のライブGCハンドルを持ちます。

関連する問題