注æ
ãã®ãã¼ã¸ã«ã¢ã¯ã»ã¹ããã«ã¯ãæ¿èªãå¿ è¦ã§ãã ãµã¤ã³ã¤ã³ã¾ãã¯ãã£ã¬ã¯ããªã®å¤æ´ã試ããã¨ãã§ãã¾ãã
ãã®ãã¼ã¸ã«ã¢ã¯ã»ã¹ããã«ã¯ãæ¿èªãå¿ è¦ã§ãã ãã£ã¬ã¯ããªã®å¤æ´ã試ããã¨ãã§ãã¾ãã
ã¡ã¢ãª ãããã ãã¡ã¤ã«ã«ã¯ãä»®æ³ã¡ã¢ãªå ã®ãã¡ã¤ã«ã®å 容ãå«ã¾ãã¾ãã ãã¡ã¤ã«ã¨ã¡ã¢ãªé åã®éã®ãã®ãããã³ã°ã«ãããè¤æ°ã®ããã»ã¹ãå«ãã¢ããªã±ã¼ã·ã§ã³ã¯ãã¡ã¢ãªã¸ã®ç´æ¥èªã¿åãã¨æ¸ãè¾¼ã¿ãè¡ã£ã¦ãã¡ã¤ã«ã夿´ã§ãã¾ãã ããã¼ã¸ã ã³ã¼ãã使ç¨ããã¨ããMemory-Mapped ãã¡ã¤ã«ã®ç®¡çãã®èª¬æã«å¾ã£ã¦ããã¤ãã£ã Windows 颿°ãã¡ã¢ãª ããããã¡ã¤ã«ã«ã¢ã¯ã»ã¹ããã®ã¨åãæ¹æ³ã§ãã¡ã¢ãª ããã ã ãã¡ã¤ã«ã«ã¢ã¯ã»ã¹ã§ãã¾ãã
ã¡ã¢ãª ãããã ãã¡ã¤ã«ã«ã¯ã次㮠2 種é¡ãããã¾ãã
æ°¸ç¶åã¡ã¢ãª ãããã ãã¡ã¤ã«
æ°¸ç¶åããããã¡ã¤ã«ã¯ããã£ã¹ã¯ä¸ã®ã½ã¼ã¹ ãã¡ã¤ã«ã«é¢é£ä»ãããã¦ããã¡ã¢ãª ãããã ãã¡ã¤ã«ã§ãã æå¾ã®ããã»ã¹ã§ãã¡ã¤ã«ã®æä½ãå®äºããã¨ããã¼ã¿ã¯ãã£ã¹ã¯ä¸ã®ã½ã¼ã¹ ãã¡ã¤ã«ã«ä¿åããã¾ãã ãããã®ã¡ã¢ãª ããããã¡ã¤ã«ã¯ãé常ã«å¤§ããªã½ã¼ã¹ ãã¡ã¤ã«ã®æä½ã«é©ãã¦ãã¾ãã
éæ°¸ç¶åã¡ã¢ãª ãããã ãã¡ã¤ã«
éæ°¸ç¶åãã¡ã¤ã«ã¯ããã£ã¹ã¯ä¸ã®ãã¡ã¤ã«ã«é¢é£ä»ãããã¦ããªãã¡ã¢ãª ããããã¡ã¤ã«ã§ãã æå¾ã®ããã»ã¹ããã¡ã¤ã«ã®æä½ãå®äºããã¨ããã¼ã¿ã¯å¤±ããããã¡ã¤ã«ã¯ã¬ãã¼ã¸ ã³ã¬ã¯ã·ã§ã³ã«ãã£ã¦åå©ç¨ããã¾ãã ãããã®ãã¡ã¤ã«ã¯ãããã»ã¹ééä¿¡ (IPC) ç¨ã®å ±æã¡ã¢ãªã使ããã®ã«é©ãã¦ãã¾ãã
ããã»ã¹ããã¥ã¼ãããã³ã¡ã¢ãªã®ç®¡ç
ã¡ã¢ãª ãããã ãã¡ã¤ã«ã¯ãè¤æ°ã®ããã»ã¹éã§å ±æã§ãã¾ãã ããã»ã¹ã¯ããã¡ã¤ã«ã使ããããã»ã¹ã«ãã£ã¦å²ãå½ã¦ãããå ±éåã使ç¨ãã¦ãåãã¡ã¢ãª ããã ãã¡ã¤ã«ã«ãããã§ãã¾ãã
ã¡ã¢ãª ãããã ãã¡ã¤ã«ãæä½ããã«ã¯ãã¡ã¢ãª ããããã¡ã¤ã«å ¨ä½ã¾ãã¯ãã®ä¸é¨ã®ãã¥ã¼ã使ããå¿ è¦ãããã¾ãã ã¡ã¢ãª ããããã¡ã¤ã«ã®åãé¨åã«å¯¾ãã¦è¤æ°ã®ãã¥ã¼ã使ãã¦ãåæå®è¡ã¡ã¢ãªã使ãããã¨ãã§ãã¾ãã 2 ã¤ã®ãã¥ã¼ãåæã«ç¶æããã«ã¯ãåãã¡ã¢ãª ãããã ãã¡ã¤ã«ãã使ããå¿ è¦ãããã¾ãã
ãã¡ã¤ã«ãã¡ã¢ãª ãããã³ã°ã«ä½¿ç¨ã§ããã¢ããªã±ã¼ã·ã§ã³ã®è«çã¡ã¢ãªé åã®ãµã¤ãº (32 ããã ã³ã³ãã¥ã¼ã¿ã¼ã§ã¯ 2 GB) ãã大ããå ´åã¯ãè¤æ°ã®ãã¥ã¼ãå¿ è¦ã«ãªãå ´åãããã¾ãã
ãã¥ã¼ã«ã¯ãã¹ããªã¼ã ã¢ã¯ã»ã¹ ãã¥ã¼ã¨ã©ã³ãã ã¢ã¯ã»ã¹ ãã¥ã¼ã® 2 種é¡ãããã¾ãã ãã¡ã¤ã«ã¸ã®é 次ã¢ã¯ã»ã¹ã«ã¯ã¹ããªã¼ã ã¢ã¯ã»ã¹ ãã¥ã¼ã使ç¨ãã¾ããããã¯ãéæ°¸ç¶åãã¡ã¤ã«ã¨ IPC ã«æ¨å¥¨ããã¾ãã æ°¸ç¶åããããã¡ã¤ã«ãæä½ããå ´åã¯ãã©ã³ãã ã¢ã¯ã»ã¹ ãã¥ã¼ã使ç¨ãããã¨ããå§ããã¾ãã
ã¡ã¢ãª ããããã¡ã¤ã«ã¯ãªãã¬ã¼ãã£ã³ã° ã·ã¹ãã ã®ã¡ã¢ãª ããã¼ã¸ã£ã¼ãä»ãã¦ã¢ã¯ã»ã¹ãããããããã¡ã¤ã«ã¯èªåçã«è¤æ°ã®ãã¼ã¸ã«ãã¼ãã£ã·ã§ã³åå²ãããå¿ è¦ã«å¿ãã¦ã¢ã¯ã»ã¹ããã¾ãã ã¡ã¢ãªç®¡çãèªåã§å¦çããå¿ è¦ã¯ããã¾ããã
次ã®å³ã¯ãè¤æ°ã®ããã»ã¹ãåä¸ã®ã¡ã¢ãª ããã ãã¡ã¤ã«ã«å¯¾ãã¦è¤æ°ã®éè¤ãã¥ã¼ãåæã«æã¤æ¹æ³ã示ãã¦ãã¾ãã
次ã®ç»åã§ã¯ãã¡ã¢ãª ãããã ãã¡ã¤ã«ã¸ã®è¤æ°ã®éãªããã¥ã¼ã確èªã§ãã¾ãã
Memory-Mapped ãã¡ã¤ã«ã使ç¨ããããã°ã©ãã³ã°
次ã®è¡¨ã«ãã¡ã¢ãª ãããã ãã¡ã¤ã« ãªãã¸ã§ã¯ãã¨ãã®ã¡ã³ãã¼ã使ç¨ããããã®ã¬ã¤ãã示ãã¾ãã
èª²é¡ | 使ç¨ããã¡ã½ããã¾ãã¯ãããã㣠|
---|---|
ãã£ã¹ã¯ä¸ã®ãã¡ã¤ã«ãããæ°¸ç¶åãããã¡ã¢ãª ãããã ãã¡ã¤ã«ã表ã MemoryMappedFile ãªãã¸ã§ã¯ããåå¾ãã¾ãã | MemoryMappedFile.CreateFromFile ã¡ã½ãã |
éæ°¸ç¶åã¡ã¢ãª ãããã ãã¡ã¤ã« (ãã£ã¹ã¯ä¸ã®ãã¡ã¤ã«ã«é¢é£ä»ãããã¦ããªã) ã表ã MemoryMappedFile ãªãã¸ã§ã¯ããåå¾ãã¾ãã |
MemoryMappedFile.CreateNew ã¡ã½ãã -åã¯- MemoryMappedFile.CreateOrOpen ã¡ã½ãã |
æ¢åã® (æ°¸ç¶åã¾ãã¯éæ°¸ç¶å) ã¡ã¢ãª ãããã ãã¡ã¤ã«ã® MemoryMappedFile ãªãã¸ã§ã¯ããåå¾ããã | MemoryMappedFile.OpenExisting ã¡ã½ãã |
ã¡ã¢ãª ãããã ãã¡ã¤ã«ã«é£ç¶ãã¦ã¢ã¯ã»ã¹ããããã¥ã¼ã® UnmanagedMemoryStream ãªãã¸ã§ã¯ããåå¾ãã¾ãã | MemoryMappedFile.CreateViewStream ã¡ã½ãã |
ã¡ã¢ãª ãããã ãã¡ã¤ã«ã¸ã®ã©ã³ãã ã¢ã¯ã»ã¹ ãã¥ã¼ã® UnmanagedMemoryAccessor ãªãã¸ã§ã¯ããåå¾ãã¾ãã | MemoryMappedFile.CreateViewAccessor ã¡ã½ãã |
ã¢ã³ããã¼ã¸ ã³ã¼ãã§ä½¿ç¨ãã SafeMemoryMappedViewHandle ãªãã¸ã§ã¯ããåå¾ãã¾ãã |
MemoryMappedFile.SafeMemoryMappedFileHandle ããããã£ã -åã¯- MemoryMappedViewAccessor.SafeMemoryMappedViewHandle ããããã£ã -åã¯- MemoryMappedViewStream.SafeMemoryMappedViewHandle ããããã£ã |
ãã¥ã¼ã使ãããã¾ã§ã¡ã¢ãªã®å²ãå½ã¦ãé
ããã (éæ°¸ç¶åãã¡ã¤ã«ã®ã¿)ã (ç¾å¨ã®ã·ã¹ãã ãã¼ã¸ ãµã¤ãºã確èªããã«ã¯ã Environment.SystemPageSize ããããã£ã使ç¨ãã¾ã)ã |
CreateNewå¤ãæã¤ MemoryMappedFileOptions.DelayAllocatePages ã¡ã½ããã -åã¯- CreateOrOpen MemoryMappedFileOptionsåæä½ããã©ã¡ã¼ã¿ã¼ã¨ãã¦æã¤ã¡ã½ããã |
å®å ¨
ã¡ã¢ãª ãããã ãã¡ã¤ã«ã使ããã¨ãã«ã¢ã¯ã»ã¹æ¨©ãé©ç¨ããã«ã¯ã MemoryMappedFileAccess åæä½ããã©ã¡ã¼ã¿ã¼ã¨ãã¦åãåãæ¬¡ã®ã¡ã½ããã使ç¨ãã¾ãã
OpenExistingããã©ã¡ã¼ã¿ã¼ã¨ãã¦åãåãMemoryMappedFileRights ã¡ã½ããã使ç¨ãã¦ãæ¢åã®ã¡ã¢ãª ãããã ãã¡ã¤ã«ãéãã¢ã¯ã»ã¹æ¨©ãæå®ã§ãã¾ãã
ããã«ãå®ç¾©æ¸ã¿ã®ã¢ã¯ã»ã¹è¦åãå«ã MemoryMappedFileSecurity ãªãã¸ã§ã¯ããå«ãããã¨ãã§ãã¾ãã
ã¡ã¢ãª ãããã ãã¡ã¤ã«ã«æ°ããã¢ã¯ã»ã¹è¦åã¾ãã¯å¤æ´ãããã¢ã¯ã»ã¹è¦åãé©ç¨ããã«ã¯ã SetAccessControl ã¡ã½ããã使ç¨ãã¾ãã æ¢åã®ãã¡ã¤ã«ããã¢ã¯ã»ã¹è¦åã¾ãã¯ç£æ»è¦åãåå¾ããã«ã¯ã GetAccessControl ã¡ã½ããã使ç¨ãã¾ãã
ä¾ç¤º
æ°¸ç¶åã¡ã¢ãª ãããã ãã¡ã¤ã«
CreateFromFileã¡ã½ããã¯ããã£ã¹ã¯ä¸ã®æ¢åã®ãã¡ã¤ã«ããã¡ã¢ãª ãããã ãã¡ã¤ã«ã使ãã¾ãã
次ã®ä¾ã§ã¯ãé常ã«å¤§ããªãã¡ã¤ã«ã®ä¸é¨ã®ã¡ã¢ãª ããããã¥ã¼ã使ãããã®ä¸é¨ãæä½ãã¾ãã
using System;
using System.IO;
using System.IO.MemoryMappedFiles;
using System.Runtime.InteropServices;
class Program
{
static void Main(string[] args)
{
long offset = 0x10000000; // 256 megabytes
long length = 0x20000000; // 512 megabytes
// Create the memory-mapped file.
using (var mmf = MemoryMappedFile.CreateFromFile(@"c:\ExtremelyLargeImage.data", FileMode.Open,"ImgA"))
{
// Create a random access view, from the 256th megabyte (the offset)
// to the 768th megabyte (the offset plus length).
using (var accessor = mmf.CreateViewAccessor(offset, length))
{
int colorSize = Marshal.SizeOf(typeof(MyColor));
MyColor color;
// Make changes to the view.
for (long i = 0; i < length; i += colorSize)
{
accessor.Read(i, out color);
color.Brighten(10);
accessor.Write(i, ref color);
}
}
}
}
}
public struct MyColor
{
public short Red;
public short Green;
public short Blue;
public short Alpha;
// Make the view brighter.
public void Brighten(short value)
{
Red = (short)Math.Min(short.MaxValue, (int)Red + value);
Green = (short)Math.Min(short.MaxValue, (int)Green + value);
Blue = (short)Math.Min(short.MaxValue, (int)Blue + value);
Alpha = (short)Math.Min(short.MaxValue, (int)Alpha + value);
}
}
Imports System.IO
Imports System.IO.MemoryMappedFiles
Imports System.Runtime.InteropServices
Class Program
Sub Main()
Dim offset As Long = &H10000000 ' 256 megabytes
Dim length As Long = &H20000000 ' 512 megabytes
' Create the memory-mapped file.
Using mmf = MemoryMappedFile.CreateFromFile("c:\ExtremelyLargeImage.data", FileMode.Open, "ImgA")
' Create a random access view, from the 256th megabyte (the offset)
' to the 768th megabyte (the offset plus length).
Using accessor = mmf.CreateViewAccessor(offset, length)
Dim colorSize As Integer = Marshal.SizeOf(GetType(MyColor))
Dim color As MyColor
Dim i As Long = 0
' Make changes to the view.
Do While (i < length)
accessor.Read(i, color)
color.Brighten(10)
accessor.Write(i, color)
i += colorSize
Loop
End Using
End Using
End Sub
End Class
Public Structure MyColor
Public Red As Short
Public Green As Short
Public Blue As Short
Public Alpha As Short
' Make the view brighter.
Public Sub Brighten(ByVal value As Short)
Red = CType(Math.Min(Short.MaxValue, (CType(Red, Integer) + value)), Short)
Green = CType(Math.Min(Short.MaxValue, (CType(Green, Integer) + value)), Short)
Blue = CType(Math.Min(Short.MaxValue, (CType(Blue, Integer) + value)), Short)
Alpha = CType(Math.Min(Short.MaxValue, (CType(Alpha, Integer) + value)), Short)
End Sub
End Structure
次ã®ä¾ã§ã¯ãå¥ã®ããã»ã¹ã«å¯¾ãã¦åãã¡ã¢ãª ãããã ãã¡ã¤ã«ãéãã¾ãã
using System;
using System.IO.MemoryMappedFiles;
using System.Runtime.InteropServices;
class Program
{
static void Main(string[] args)
{
// Assumes another process has created the memory-mapped file.
using (var mmf = MemoryMappedFile.OpenExisting("ImgA"))
{
using (var accessor = mmf.CreateViewAccessor(4000000, 2000000))
{
int colorSize = Marshal.SizeOf(typeof(MyColor));
MyColor color;
// Make changes to the view.
for (long i = 0; i < 1500000; i += colorSize)
{
accessor.Read(i, out color);
color.Brighten(20);
accessor.Write(i, ref color);
}
}
}
}
}
public struct MyColor
{
public short Red;
public short Green;
public short Blue;
public short Alpha;
// Make the view brigher.
public void Brighten(short value)
{
Red = (short)Math.Min(short.MaxValue, (int)Red + value);
Green = (short)Math.Min(short.MaxValue, (int)Green + value);
Blue = (short)Math.Min(short.MaxValue, (int)Blue + value);
Alpha = (short)Math.Min(short.MaxValue, (int)Alpha + value);
}
}
Imports System.IO.MemoryMappedFiles
Imports System.Runtime.InteropServices
Class Program
Public Shared Sub Main(ByVal args As String())
' Assumes another process has created the memory-mapped file.
Using mmf = MemoryMappedFile.OpenExisting("ImgA")
Using accessor = mmf.CreateViewAccessor(4000000, 2000000)
Dim colorSize As Integer = Marshal.SizeOf(GetType(MyColor))
Dim color As MyColor
' Make changes to the view.
Dim i As Long = 0
While i < 1500000
accessor.Read(i, color)
color.Brighten(30)
accessor.Write(i, color)
i += colorSize
End While
End Using
End Using
End Sub
End Class
Public Structure MyColor
Public Red As Short
Public Green As Short
Public Blue As Short
Public Alpha As Short
' Make the view brigher.
Public Sub Brighten(ByVal value As Short)
Red = CShort(Math.Min(Short.MaxValue, CInt(Red) + value))
Green = CShort(Math.Min(Short.MaxValue, CInt(Green) + value))
Blue = CShort(Math.Min(Short.MaxValue, CInt(Blue) + value))
Alpha = CShort(Math.Min(Short.MaxValue, CInt(Alpha) + value))
End Sub
End Structure
éæ°¸ç¶åã¡ã¢ãª ãããã ãã¡ã¤ã«
CreateNewã¡ã½ãã㨠CreateOrOpen ã¡ã½ããã¯ããã£ã¹ã¯ä¸ã®æ¢åã®ãã¡ã¤ã«ã«ãããããã¦ããªãã¡ã¢ãª ãããã ãã¡ã¤ã«ã使ãã¾ãã
次ã®ä¾ã¯ãã¡ã¢ãª ãããã ãã¡ã¤ã«ã«ãã¼ã«å¤ãæ¸ãè¾¼ã 3 ã¤ã®åå¥ã®ããã»ã¹ (ã³ã³ã½ã¼ã« ã¢ããªã±ã¼ã·ã§ã³) ã§æ§æããã¦ãã¾ãã æ¬¡ã®ä¸é£ã®ã¢ã¯ã·ã§ã³ãçºçãã¾ãã
Process A
ã§ã¯ãã¡ã¢ãª ãããã ãã¡ã¤ã«ã使ãããå¤ãæ¸ãè¾¼ã¾ãã¾ããProcess B
ã¯ãã¡ã¢ãª ãããã ãã¡ã¤ã«ãéããå¤ãæ¸ãè¾¼ã¿ã¾ããProcess C
ã¯ãã¡ã¢ãª ãããã ãã¡ã¤ã«ãéããå¤ãæ¸ãè¾¼ã¿ã¾ããProcess A
ã¯ãã¡ã¢ãª ãããã ãã¡ã¤ã«ããå¤ãèªã¿åã£ã¦è¡¨ç¤ºãã¾ããProcess A
ãã¡ã¢ãª ãããã ãã¡ã¤ã«ã®å¦çãçµäºããã¨ãã¬ãã¼ã¸ ã³ã¬ã¯ã·ã§ã³ã«ãã£ã¦ãã¡ã¤ã«ãç´ã¡ã«ã¯ãªã¢ããã¾ãã
ãã®ä¾ãå®è¡ããã«ã¯ãæ¬¡ã®æä½ãè¡ãã¾ãã
ã¢ããªã±ã¼ã·ã§ã³ãã³ã³ãã¤ã«ãã3 ã¤ã®ã³ãã³ã ããã³ãã ã¦ã£ã³ãã¦ãéãã¾ãã
æåã®ã³ãã³ã ããã³ãã ã¦ã£ã³ãã¦ã§ã
Process A
ãå®è¡ãã¾ãã2 çªç®ã®ã³ãã³ã ããã³ãã ã¦ã£ã³ãã¦ã§ã
Process B
ãå®è¡ãã¾ããProcess A
ã«æ»ããEnter ãã¼ãæ¼ãã¾ãã3 çªç®ã®ã³ãã³ã ããã³ãã ã¦ã£ã³ãã¦ã§ã
Process C
å®è¡ãã¾ããProcess A
ã«æ»ããEnter ãã¼ãæ¼ãã¾ãã
Process A
ã®åºåã¯æ¬¡ã®ã¨ããã§ãã
Start Process B and press ENTER to continue.
Start Process C and press ENTER to continue.
Process A says: True
Process B says: False
Process C says: True
ããã»ã¹ A
using System;
using System.IO;
using System.IO.MemoryMappedFiles;
using System.Threading;
class Program
{
// Process A:
static void Main(string[] args)
{
using (MemoryMappedFile mmf = MemoryMappedFile.CreateNew("testmap", 10000))
{
bool mutexCreated;
Mutex mutex = new Mutex(true, "testmapmutex", out mutexCreated);
using (MemoryMappedViewStream stream = mmf.CreateViewStream())
{
BinaryWriter writer = new BinaryWriter(stream);
writer.Write(1);
}
mutex.ReleaseMutex();
Console.WriteLine("Start Process B and press ENTER to continue.");
Console.ReadLine();
Console.WriteLine("Start Process C and press ENTER to continue.");
Console.ReadLine();
mutex.WaitOne();
using (MemoryMappedViewStream stream = mmf.CreateViewStream())
{
BinaryReader reader = new BinaryReader(stream);
Console.WriteLine($"Process A says: {reader.ReadBoolean()}");
Console.WriteLine($"Process B says: {reader.ReadBoolean()}");
Console.WriteLine($"Process C says: {reader.ReadBoolean()}");
}
mutex.ReleaseMutex();
}
}
}
Imports System.IO
Imports System.IO.MemoryMappedFiles
Imports System.Threading
Module Module1
' Process A:
Sub Main()
Using mmf As MemoryMappedFile = MemoryMappedFile.CreateNew("testmap", 10000)
Dim mutexCreated As Boolean
Dim mTex As Mutex = New Mutex(True, "testmapmutex", mutexCreated)
Using Stream As MemoryMappedViewStream = mmf.CreateViewStream()
Dim writer As BinaryWriter = New BinaryWriter(Stream)
writer.Write(1)
End Using
mTex.ReleaseMutex()
Console.WriteLine("Start Process B and press ENTER to continue.")
Console.ReadLine()
Console.WriteLine("Start Process C and press ENTER to continue.")
Console.ReadLine()
mTex.WaitOne()
Using Stream As MemoryMappedViewStream = mmf.CreateViewStream()
Dim reader As BinaryReader = New BinaryReader(Stream)
Console.WriteLine("Process A says: {0}", reader.ReadBoolean())
Console.WriteLine("Process B says: {0}", reader.ReadBoolean())
Console.WriteLine("Process C says: {0}", reader.ReadBoolean())
End Using
mTex.ReleaseMutex()
End Using
End Sub
End Module
ããã»ã¹ B
using System;
using System.IO;
using System.IO.MemoryMappedFiles;
using System.Threading;
class Program
{
// Process B:
static void Main(string[] args)
{
try
{
using (MemoryMappedFile mmf = MemoryMappedFile.OpenExisting("testmap"))
{
Mutex mutex = Mutex.OpenExisting("testmapmutex");
mutex.WaitOne();
using (MemoryMappedViewStream stream = mmf.CreateViewStream(1, 0))
{
BinaryWriter writer = new BinaryWriter(stream);
writer.Write(0);
}
mutex.ReleaseMutex();
}
}
catch (FileNotFoundException)
{
Console.WriteLine("Memory-mapped file does not exist. Run Process A first.");
}
}
}
Imports System.IO
Imports System.IO.MemoryMappedFiles
Imports System.Threading
Module Module1
' Process B:
Sub Main()
Try
Using mmf As MemoryMappedFile = MemoryMappedFile.OpenExisting("testmap")
Dim mTex As Mutex = Mutex.OpenExisting("testmapmutex")
mTex.WaitOne()
Using Stream As MemoryMappedViewStream = mmf.CreateViewStream(1, 0)
Dim writer As BinaryWriter = New BinaryWriter(Stream)
writer.Write(0)
End Using
mTex.ReleaseMutex()
End Using
Catch noFile As FileNotFoundException
Console.WriteLine("Memory-mapped file does not exist. Run Process A first." & vbCrLf & noFile.Message)
End Try
End Sub
End Module
ããã»ã¹ C
using System;
using System.IO;
using System.IO.MemoryMappedFiles;
using System.Threading;
class Program
{
// Process C:
static void Main(string[] args)
{
try
{
using (MemoryMappedFile mmf = MemoryMappedFile.OpenExisting("testmap"))
{
Mutex mutex = Mutex.OpenExisting("testmapmutex");
mutex.WaitOne();
using (MemoryMappedViewStream stream = mmf.CreateViewStream(2, 0))
{
BinaryWriter writer = new BinaryWriter(stream);
writer.Write(1);
}
mutex.ReleaseMutex();
}
}
catch (FileNotFoundException)
{
Console.WriteLine("Memory-mapped file does not exist. Run Process A first, then B.");
}
}
}
Imports System.IO
Imports System.IO.MemoryMappedFiles
Imports System.Threading
Module Module1
' Process C:
Sub Main()
Try
Using mmf As MemoryMappedFile = MemoryMappedFile.OpenExisting("testmap")
Dim mTex As Mutex = Mutex.OpenExisting("testmapmutex")
mTex.WaitOne()
Using Stream As MemoryMappedViewStream = mmf.CreateViewStream(2, 0)
Dim writer As BinaryWriter = New BinaryWriter(Stream)
writer.Write(1)
End Using
mTex.ReleaseMutex()
End Using
Catch noFile As FileNotFoundException
Console.WriteLine("Memory-mapped file does not exist. Run Process A first, then B." & vbCrLf & noFile.Message)
End Try
End Sub
End Module