codice:
public class Memoria Condivisa
{
[DllImport("kernel32.dll")]
static extern IntPtr CreateFileMapping(IntPtr hFile, IntPtr lpAttributes, uint fProtect, uint dwMaximumSizeHigh, uint dwMaximumSizeLow, string lpName);
[DllImport("kernel32.dll")]
static extern IntPtr OpenFileMapping(uint dwDesiredAccess, bool bInheritHandle, string lpName);
[DllImport("kernel32.dll")]
static extern IntPtr MapViewOfFile(IntPtr handle, uint dwDesiredAccess, uint dwFileOffsetHigh, uint dwFileOffsetLow, uint dwNumerOfBytesToMap);
[DllImport("kernel32.dll")]
static extern bool UnmapViewOfFile(IntPtr lpBaseAddress);
[DllImport("kernel32.dll")]
static extern bool CloseHandle(IntPtr hObject);
static readonly IntPtr INVALID_HANDLE_VALUE = (IntPtr)(-1);
const uint PAGE_READWRITE = 0x04;
const uint FILE_MAP_READ = 0x0004;
const uint FILE_MAP_WRITE = 0x0002;
const int NMAX_ELEMENTS = 128;
IntPtr mapHandle;
IntPtr DIT1MemPtr; //puntatore alla zona di mem condivisa
IntPtr Q1MemPtr; // coda
// SharedData values; //struttura alla quale è ricondotta la memoria non strutturata
uint dataSize;
[StructLayout(LayoutKind.Sequential)]
private struct SharedData
{
public long readValue;
public long writeValue;
public bool readState;
public bool writeState;
//public bool exceptionState; //NON UTILIZZATO
public SharedData(long d, bool b1, bool b2)
{
readValue = d;
readState = b1;
writeState = b2;
}
}
[StructLayout(LayoutKind.Sequential)]
public struct WriteQueue
{
[MarshalAs(UnmanagedType.ByValArray, SizeConst = NMAX_ELEMENTS)]
public int[] queueWrite; //indici all'interno della DIT
int start; //indice di lettura
int end; //indice di scrittura
}
[StructLayout(LayoutKind.Sequential)]
private struct Dit
{
[MarshalAs(UnmanagedType.ByValArray, SizeConst = NMAX_ELEMENTS)]
public SharedData[] DIT1;
public WriteQueue Q1;
}