*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*

<C#>
「プロセス間で記憶領域を共有 <第1ステップ: シンプルなサンプル>」のコード No.2


*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*

.






元のページ


元ページ「<C# > プロセス間で記憶領域を共有 <第1ステップ: シンプルなサンプル>」
http://note.chiebukuro.yahoo.co.jp/detail/n180372

 

記述量上限の制限で、ページを分けて記述しています。




本ページの前のページ


「プロセス間で記憶領域を共有 <第1ステップ: シンプルなサンプル>」のコード No.1

 

 

記述量上限の制限で、ページを分けて記述しています。







本ページの次のページ


「プロセス間で記憶領域を共有 <第1ステップ: シンプルなサンプル>」のコード No.3

 

記述量上限の制限で、ページを分けて記述しています。







はじめに


元ページの「<C#> プロセス間で記憶領域を共有 <第1ステップ: シンプルなサンプル>」におけるコードをここに記述します。








共有メモリ管理クラスのコード




using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;


// <C# 4.0以降> プロセス間で記憶領域を共有 <第1ステップ: シンプルなサンプル>
namespace InterProcessCommunica4ByMMF_Simple
{
    // ************************************
    // 共有メモリ管理クラス
    // ************************************
    public class SharedMemory : IDisposable
    {


        // ************************************
        // メンバー変数
        // ************************************


        // メモリマップドファイルクラス
        public System.IO.MemoryMappedFiles.MemoryMappedFile mmf;   // メモリマップドファイルクラス

 

        // マッピングオブジェクトの名前
        public String m_name;


        // マッピングオブジェクトのサイズ
        public int MaximumSize;


        // 要素の現在位置
        public int CurrentPosition = 0;

 


        // ************************************
        // コンストラクタ等
        // ************************************

 

        //========================
        // コンストラクタ<マッピングオブジェクトを生成>
        //========================


        // ==============
        // コンストラクタ
        // ファイルマッピングオブジェクトを生成する。
        // なお、プロセスのアドレス空間に、ファイルのビューをマップしない。
        // (後に、ファイルのビューをマップします)
        // 第1引数: マッピングオブジェクトの名前
        // 第2引数: ファイルマッピングオブジェクトのサイズ(バイト)
        public SharedMemory(
            String name,
            Int32 size)
        {
            // ファイルマッピングオブジェクト生成
            // (要するに、メモリマップドファイルを管理制御するための
            //   根本的なオブジェクトを生成します)
            CreateSharedMemory(size, name);
        }

 

        // ==============
        // コンストラクタ
        // ファイルマッピングオブジェクトをオープンします。
        // CreateFileMapping()で、ファイルマッピングオブジェクトが既に生成済み
        // の場合は、本コンストラクタでファイルマッピングオブジェクトをオープン
        // します。
        // これに対して、ファイルマッピングオブジェクトがまだ生成していない場合
        // は、本コンストラクタではなく、関連コンストラクタ(引数にサイズを指定
        // するもの)を実行して下さい。
        // 第1引数: マッピングオブジェクトの名前
        // 第2引数: エラーフラグを出力
        // ==============
        public SharedMemory(
            String name,
            out bool Error_Flg)
        {

            // ファイルマッピングオブジェクトのオープン
            // (要するに、メモリマップドファイルを管理制御するための
            //   根本的なオブジェクトをオープンします)
            Error_Flg = OpenSharedMemory(name);

        }

 

        //========================
        // ファイナライザ
        //========================


        // ==============
        // ファイナライザ
        ~SharedMemory()
        {
            // メモリマップドファイルに関連するオブジェクトのクリーン
            // アップ(後始末)をする。
            cleanup();
        }

 

        // ************************************
        // メンバーメソッド
        // ************************************


        // ==============
        // ファイルマッピングオブジェクト生成
        // ファイルマッピングオブジェクトを生成します。
        // なお、CreateFileMapping()で、ファイルマッピングオブジェクトが既に生
        // 成済みの場合は、本メソッドではなく、関連メソッドのOpenSharedMemory()
        // を実行して下さい。すなわち、関連メソッドのほうは、ファイルマッピング
        // オブジェクトの生成ではなく、オープンになります。
        // 第1引数: ファイルマッピングオブジェクトのサイズ(バイト)
        // 第2引数: マッピングオブジェクトの名前
        public void CreateSharedMemory(Int32 size, String SharedMemoryName)
        {

            // 共有メモリ管理クラスの生成
            // (要するに、メモリマップドファイルを管理制御するための
            //   根本的なオブジェクトを生成します)
            try
            {
                // 共有メモリ管理クラスの生成
                // (要するに、メモリマップドファイルを管理制御するための
                //   根本的なオブジェクトを生成します)
                mmf = System.IO.MemoryMappedFiles.MemoryMappedFile.CreateNew(SharedMemoryName, size);


                // マッピングオブジェクトの名前をメンバー変数へ設定
                m_name = SharedMemoryName;


                // マッピングオブジェクトのサイズをメンバー変数へ設定
                MaximumSize = size;
            }
            catch (System.IO.IOException)
            {
                // 既に生成済みのため、エラーとなった。
                // よって、生成ではなく、オープンする。
                mmf = System.IO.MemoryMappedFiles.MemoryMappedFile.OpenExisting(SharedMemoryName);


                // マッピングオブジェクトの名前をメンバー変数へ設定
                m_name = SharedMemoryName;
            }

        }

 


        // ==============
        // ファイルマッピングオブジェクトオープン
        // ファイルマッピングオブジェクトをオープンします。
        // CreateFileMapping()で、ファイルマッピングオブジェクトが既に生成済み
        // の場合は、本メソッドでファイルマッピングオブジェクトをオープンします。
        // これに対して、ファイルマッピングオブジェクトがまだ生成していない場合
        // は、本メソッドではなく、関連メソッドのCreateSharedMemory()を実行して
        // 下さい。
        // 第1引数: マッピングオブジェクトの名前
        public bool OpenSharedMemory(String SharedMemoryName)
        {
            // エラーフラグ
            bool Error_Flg = false;


            try
            {

                // ファイルマッピングオブジェクトのオープン
                // (要するに、メモリマップドファイルを管理制御するための
                //   根本的なオブジェクトをオープンします)
                mmf = System.IO.MemoryMappedFiles.MemoryMappedFile.OpenExisting(SharedMemoryName);


                // マッピングオブジェクトの名前をメンバー変数へ設定
                m_name = SharedMemoryName;

            }
            catch (System.IO.FileNotFoundException)
            {
                // エラー処理
                Error_Flg = true;
            }


            return Error_Flg;
        }


        // ==============
        // テストデーター設定メソッド
        // テスト用のデーターを作成して、それをメモリマップドファイル
        // によるメモリ領域に設定する。
        // 第1引数: メモリマップドファイルに設定するデーター
        public void SetTestData(Int32 data)
        {

            // 設定データーをバイト型配列に変換
            Byte[] ByteArray = BitConverter.GetBytes(data);


            //------------
            // メモリマップドファイルへデーター書き込み
            //------------


                // マップビューオープン
                using (var accessor = mmf.CreateViewAccessor())
                {

                    // ひとつ目のデーターを共有メモリ管理クラスに設定
                    int ind = 0;
                    for (int i = 0; i < ByteArray.Length; i++)
                    {
                        accessor.Write(ind + i, ByteArray[i]);
                    }


                    ind += sizeof(Int32);

                }

        }


        // ==============
        // クリーンアップ
        //  --- メモリマップドファイルに関連するオブジェクトのクリーン
        //      アップ(後始末)をするメソッド
        public void cleanup()
        {

            if (mmf != null)
            {
                // メモリマップドファイルの解放。
                mmf.Dispose();

                mmf = null;
            }

        }

 


        // ==============
        // アンマネージ リソース解放メソッド
        //  --- アンマネージ(非.NET)のリソースの解放を定義します。
        //      ここで、「アンマネージのリソース」とは、メモリマップドフ
        //      ァイルに関連するオブジェクトのことです。
        // -------
        // IDisposableインターフェイスを実装した場合は、本メソッドを必ず
        // 定義するように定められています。
        public void Dispose()
        {
            // クリーンアップ
            cleanup();
        }


    }
}



さいごに


本ページの内容説明については、元ページを参照して下さい。