2016-06-01 27 views
6

Bir C++ uygulamasından paylaşılan belleği kullanarak bir C# uygulamasına veri akışı yapmaya çalışıyorum. Bulduğum Örneğin dayanarak, var:C++ 'dan C#' a paylaşılan bellek üzerinden veri akışı

C++, (alıcı)

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#

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++ yan değişkeni günceller asla (gönderme) bana ben bir şey kaçırmış düşünüyorum yapma If-loop'umda. Ayrıca, her zaman çalışan bir döngü burada gitmek için en iyi yoldur? Verileri daha verimli bir sistem haline getirmek için C# tarafından bir şekilde 'talep' etme yolu var mı? Teşekkür ederim.

cevap

2

..Genel olarak bu işe yarıyor, değişkenin yanlış yerde güncellemesine sahiptim. Ben düzenledim ve başkaları için kod bırakacaktır.