2016-06-01 29 views
6

Próbuję przesyłać strumieniowo dane z aplikacji C++ do aplikacji C# za pomocą pamięci współużytkowanej. W oparciu o przykład znalazłem, mam:Strumień danych od C++ do C# nad pamięcią wspólną

C++ (wysyłanie)

struct Pair { 
    int length; 
    float data[3]; 
}; 

#include <windows.h> 
#include <stdio.h> 

struct Pair* p; 
HANDLE handle; 

float dataSend[3]{ 22,33,44 }; 

bool startShare() 
{ 
    try 
    { 
     handle = CreateFileMappingW(INVALID_HANDLE_VALUE, NULL, PAGE_READWRITE, 0, sizeof(Pair), L"DataSend"); 
     p = (struct Pair*) MapViewOfFile(handle, FILE_MAP_READ | FILE_MAP_WRITE, 0, 0, sizeof(Pair)); 
     return true; 
    } 
    catch(...) 
    { 
     return false; 
    } 

} 


int main() 
{ 

    if (startShare() == true) 
    { 

      while (true) 
      { 
       if (p != 0) { 

       //dataSend[0] += 1; // here the value doesn't refresh 
       for (int h = 0; h < 3; h++) 
       { 
        p->data[h] = dataSend[h]; 
       } 
      //dataSend[0] += 1; // here it does 
      } 


     else 
      puts("create shared memory error"); 
    } 
    } 
    if (handle != NULL) 
     CloseHandle(handle); 
    return 0; 
} 

C# (odbiór)

namespace sharedMemoryGET 
{ 
    class Program 
    { 
     public static float[] data = new float[3]; 
     public static MemoryMappedFile mmf; 
     public static MemoryMappedViewStream mmfvs; 

     static public bool MemOpen() 
     { 
      try { 
       mmf = MemoryMappedFile.OpenExisting("DataSend"); 
       mmfvs = mmf.CreateViewStream(); 
       return true; 
      } 
      catch 
      { 
       return false; 
      } 

     } 

     public static void Main(string[] args) 
     { 
      while (true) 
      { 
       if (MemOpen()) 
      { 

        byte[] blen = new byte[4]; 
        mmfvs.Read(blen, 0, 4); 
        int len = blen[0] + blen[1] * 256 + blen[2] * 65536 + blen[2] * 16777216; 

        byte[] bPosition = new byte[12]; 
        mmfvs.Read(bPosition, 0, 12); 
        Buffer.BlockCopy(bPosition, 0, data, 0, bPosition.Length); 
        Console.WriteLine(data[0]); 
       } 
      } 
     } 
    } 
} 

C++ strona nie aktualizuje zmienną, co ja myślę, że coś przeoczyć w mojej pętli if. Dodatkowo, czy zawsze działająca pętla to najlepszy sposób, aby tu dotrzeć? Czy istnieje sposób "żądania" danych w jakiś sposób od strony C#, aby uczynić to bardziej wydajnym systemem? Dziękuję Ci.

Odpowiedz

2

.. Właściwie to działa, miałem aktualizację zmiennej w niewłaściwym miejscu. Edytowałem i zostawiam kod dla innych.