2014-12-29 3 views
1

Я использую пример Kinect Face-Tracking Basics WPF для сбора данных с объекта. Я могу получить доступ к данным в текстовом файле и т. Д., Но я хочу записать данные в управляемую память в процессе C#, и программа .NET в Labview забирает данные из того же места.Запись в память в .NET и получение данных процесса в лабораторном режиме

До сих пор, это то, что у меня есть:

    this.facePoints3D = frame.Get3DShape(); 

        // using (MemoryStream stream = new MemoryStream()) 
        // { 
         //var sw = new StreamWriter(stream); 
         int n = 121; 
         foreach (Vector3DF[] vector in facePoints3D.GetSlices(n)) 
         { 
          //convert from float to byte array before we pass on to memory 
          var bytearray = new byte[vector.Length * this.facePoints3D.Count]; 
          Buffer.BlockCopy(vector, 0, bytearray, 0, bytearray.Length); 

          //Initialize unmanaged memory to hold array. 
          int size = Marshal.SizeOf(bytearray[0]) * bytearray.Length; 

          IntPtr pnt = Marshal.AllocHGlobal(size); 

          try 
          { 
           //copy the array to unmanaged memory. 
           Marshal.Copy(bytearray, 0, pnt, bytearray.Length); 

           // Copy the unmanaged array back to another managed array. 

           byte[] bytearray2 = new byte[bytearray.Length]; 

           Marshal.Copy(pnt, bytearray2, 0, bytearray.Length); 

           //Console.WriteLine("The array was coppied to unmanaged memory and back."); 
          } 
          finally 
          { 
           // Free the unmanaged memory. 
           Marshal.FreeHGlobal(pnt); 
          } 

}

До сих пор, у меня есть программа LabView правильно настроить, как

процесса A (C#): MemoryStream буфера -> Маршал AllocHGlobal -> Маршал Копия -> Маршал Утилизатор -> IntPtr ToInt64 Процесс B (labview): Значение IntPtr -> Marshall AllocHGlobal -> Маршал Копия -> Назначение

Теперь конец лабиринта работает хорошо, но, похоже, он не собирает значения из памяти.

Совет, пожалуйста?

ответ

1

Являются ли эти два отдельных процесса? (2 отдельных exes). Если это так, вы не сможете обмениваться памятью с помощью прямого распределения из-за изоляции процесса (1 процесс не может видеть память другого процесса).

Предполагая, что ваш ответ "да" (2 отдельных процессы), рассмотреть возможность использования именованных каналов для связи перекрестного процесса (или обернуть его с WCF)

Interprocess связи с Named Pipes: http://msdn.microsoft.com/en-us/library/bb546085(v=vs.110).aspx

WCF учебник: основные межпроцессный: http://tech.pro/tutorial/855/wcf-tutorial-basic-interprocess-communication

Вы также можете использовать отображенные в память файл: http://www.abhisheksur.com/2012/02/inter-process-communication-using.html

EDIT

Добавлен пример использования двоичного сериализатора вместо выполнения ручных копий памяти структуры. Вы можете записать результирующие байт-массивы в файл с отображением памяти. Это решение требует применения атрибута [Serializable] к структуре Vector3DF и предполагает, что код, читающий память, имеет одно и то же определение типа для Vector3DF.

(примечание:. В коде в комментариях, это выглядело так, как будто вы работаете с массивом массивов Vector3DF структур, так что, как я смоделировал код сериализации Отрегулировать при необходимости

 

     public byte[] SerializeVectors(Vector3DF[][] vectors) 
     { 
      var formatter = new BinaryFormatter(); 
      // note: if you are using a stream to write to the memory mapped file, 
      // you could pass it in instead of using this memory stream as an intermediary 
      using (var stream = new MemoryStream()) 
      { 
       formatter.Serialize(stream, vectors); 
       return stream.ToArray(); 
      } 
     } 

     public Vector3DF[][] DeserializeVectors(byte[] vectorBuffer) 
     { 
      var formatter = new BinaryFormatter(); 
      using (var stream = new MemoryStream(vectorBuffer, false)) 
      { 
       return (Vector3DF[][])formatter.Deserialize(stream); 
      } 
     } 

Здесь это ссылка на Gist, которая содержит рабочий код и единичный тест, чтобы вы могли поиграть с ним: https://gist.github.com/jsmarsch/d0dcade8c656b94f5c1c

+0

Это два отдельных процесса, да @JMarsch. Один в C# Запись в поток памяти и другое я думаю, что пример файла с отображением памяти будет работать лучше всего для меня на данный момент. – Calorified

+0

@Calorified Рад помочь. Если это работает для вас, отметьте мой ответ в качестве ответа (флажок чуть ниже балла точки). Это даст мне несколько моментов, но что еще более важно, будущие читатели с той же проблемой знают, что этот маршрут работал на вас. – JMarsch

+0

привет @JMarsch. Я получил настройку файла mappedmemory, но у меня есть сбой в моем коде из-за преобразования типа.Вот код, возможно, вы могли бы помочь немного больше: this.facePoints3D = frame.Get3DShape(); foreach (Vector3DF [] vector in facePoints3D.GetSlices (n)) { byte [] bytearray = новый байт [vector.Length * this.facePoints3D.Count]; Buffer.BlockCopy (вектор, 0, bytearray, 0, bytearray.Length); } – Calorified