プロセス間のC#共有メモリ通信



C Shared Memory Communication Between Processes



2.1永続メモリマップファイル

既存のファイルに基づいて、指定された共通名でメモリマップトファイルを作成します

画像
 using (var mmf = MemoryMappedFile.CreateFromFile(@'c: memory mapped file.data',FileMode.Open, 'Common name')) { //Create a memory-mapped file view server with the specified offset and size using (var accessor = mmf.CreateViewAccessor(offset, length)) //Offset, can control the memory location of data storage size, used to control the space occupied by storage  { //Marshal provides a set of methods for allocating unmanaged memory, copying unmanaged memory blocks, converting managed types to unmanaged types, and other miscellaneous methods used when interacting with unmanaged code. int size = Marshal.SizeOf(typeof(char)) //Modify the memory map file view for (long i = 0 i  size) { char c= accessor.ReadChar(i) accessor.Write(i, ref c) } } } //Another process or thread can open an existing memory mapped file with the specified name in the system memory using (var mmf = MemoryMappedFile.OpenExisting('Common name')) { using (var accessor = mmf.CreateViewAccessor(4000000, 2000000)) { int size = Marshal.SizeOf(typeof(char)) for (long i = 0 i  size) { char c = accessor.ReadChar(i) accessor.Write(i, ref c) } } } 
画像

2.2非永続メモリマップファイル

ディスク上の既存のファイルにマップされていないメモリマップファイル



画像
 using (MemoryMappedFile mmf = MemoryMappedFile.CreateNew('testmap', 10000)) { bool mutexCreated //Inter-process synchronization Mutex mutex = newMutex(true, 'testmapmutex', out mutexCreated) using (var stream = mmf.CreateViewStream()) //Create file memory view stream stream-based operation  { var writer = newBinaryWriter(stream) writer.Write(1) } mutex.ReleaseMutex() Console.WriteLine('Start Process B and press ENTER to continue.') Console.ReadLine() mutex.WaitOne() using (MemoryMappedViewStream stream = mmf.CreateViewStream()) { var reader = newBinaryReader(stream) Console.WriteLine('Process A says: {0}', reader.ReadBoolean()) Console.WriteLine('Process B says: {0}', reader.ReadBoolean()) } mutex.ReleaseMutex() } using (MemoryMappedFile mmf = MemoryMappedFile.OpenExisting('testmap')) { Mutex mutex = Mutex.OpenExisting('testmapmutex') mutex.WaitOne() using (var stream = mmf.CreateViewStream(1, 0))//Note the offset here  { var writer = newBinaryWriter(stream) writer.Write(0) } mutex.ReleaseMutex() }
画像

2.3完全なデモ

C#共有メモリの非永続通信の例。通信中のスレッドとプロセスの制御に問題はありません。以下は実装されたコードです。

最初にメッセージサービスIMServer_Messageを開始し、



状態サービスIMServer_Stateを再起動します。

IMServer_Message一度入力します(共有メモリの共通名と共通スレッドロックを作成し、ビューストリームモードで共有メモリを書き込みます)、

IMServer_Stateを1回入力します(共有メモリを取得し、ビューストリームモードで書き込み、ビューアクセサーの書き込み構造タイプ)



そして、すぐにIMServer_Messageをもう一度入力します(今書いたメッセージを読んでください)。

IMServer_State画面の表示の変化を観察し、約5秒間待機します(スレッドロック)(スレッドロックが解除されます)

IMServer_Messageの画面表示を確認します(共有メモリに書き込まれたばかりのメッセージを表示します)

IMServer_Message.exe コード

コードを見る

IMServer_State.exe コード

コードを見る

2.4マルチスレッド同期とデータ共有の場合

このプロジェクトには2つの例があります。最初の例はDEMOフォルダーにあります。これはマルチプロセス同期テクノロジーです。 main関数で実行する必要があります。 2番目の例では、プロジェクトを直接開いて実行し、複数のプロセスのメモリデータを共有できます。共有、同期テクノロジーはセマフォを使用します。

ダウンロードリンク: MultiProcess.rar

コメントしてプログラムを改善することを歓迎します、それがあなたを助けるならば、それを好きにしてください:)。

参考記事

プロセス間のC#共有メモリ通信








この記事は、元のリンクであるwenglabsブログガーデンブログから転送されます:http://www.cnblogs.com/arxive/p/7222185.html、転載が必要な場合は原作者にご連絡ください