예제 #1
0
        static void Main(string[] args)
        {
            if (args.Length > 0)
            {
                producer = new SharedMemory("noname1", 255);
                consumer = new SharedMemory("noname2", 255);
            }
            else
            {
                producer = new SharedMemory("noname2", 255);
                consumer = new SharedMemory("noname1", 255);
            }

            consumer.ReceiveHandler += new ReceivedEventHandler <byte[]>(Program.HandleConsumerReceiveEvent);

            //Console.WriteLine("Press return to start ");
            //Console.ReadLine();
            if (args.Length > 0)
            {
                Console.WriteLine("Sending PING");
                producer.Write(ASCIIEncoding.ASCII.GetBytes("PING: " + DateTime.Now.ToString()));
            }

            Console.WriteLine("Press return to exit ");
            Console.ReadLine();
            consumer.Close();
            producer.Close();
        }
        /// <summary>クライアント生成 - ReadWriteスレッド関数</summary>
        private void ReadWriteSharedMemory()
        {
            // 共有メモリ(サーバ)
            SharedMemory sm = null;

            // スレッドID
            int managedThreadId = Thread.CurrentThread.ManagedThreadId;

            try
            {
                // 共有メモリを生成(256バイト)
                sm = new SharedMemory("my-sm", 256, "my-mtx");

                // マップ
                sm.Map(0, 0);
                // ロック
                sm.Lock();

                // 受信(バイト → int)
                byte[] rcvByte = null;
                sm.GetMemory(out rcvByte, 0);
                //int i = BitConverter.ToInt32(rcvByte, 0);
                short i = BitConverter.ToInt16(rcvByte, 0);

                // 受信メッセージを表示
                this.SetResult_Client(
                    string.Format("({0})受信:{1}", managedThreadId, i.ToString()));

                // 送信(int → バイト)
                byte[] sndByte = null;

                // 共有メモリを初期化
                sm.SetMemory(this.InitBuff(256), 256);

                // (++i)を送信
                sndByte = BitConverter.GetBytes(++i);
                sm.SetMemory(sndByte, sndByte.Length);
                //sm.SetMemory(sndByte, sndByte.Length);

                // 送信メッセージを表示
                this.SetResult_Client(
                    string.Format("({0})送信:{1}", managedThreadId, i.ToString()));
            }
            catch (Exception ex)
            {
                // エラーを表示
                this.SetResult_Client(
                    string.Format("({0})エラー:{1}", managedThreadId, ex.ToString()));
            }
            finally
            {
                if (sm != null)
                {
                    // 共有メモリをクローズ
                    // アンロック&マネージ・アンマネージリソースの解放
                    sm.Close();// ←コメントアウトするとGC任せになるが、ミューテックスの解放が遅れる!
                }
            }
        }
예제 #3
0
        void Profile_ProfileStopped(object sender, EventArgs e)
        {
            _textureMemory.Close();
            _textureMemory.Dispose();
            _textureMemory = null;

            IsRunning = false;
        }
예제 #4
0
        /// <summary>サーバ起動 - pollingスレッド関数</summary>
        private void PollingSharedMemory(object o)
        {
            // 共有メモリ(サーバ)
            SharedMemory sm = null;

            // スレッドID
            int managedThreadId = Thread.CurrentThread.ManagedThreadId;

            try
            {
                // 共有メモリを生成
                sm = new SharedMemory("my-sm", 256, "my-mtx");

                // マップ
                sm.Map(0, 0);

                // Polling開始を表示
                this.SetResult_Svr(
                    string.Format("Polling開始! - ThreadId:{0}", managedThreadId));

                // Polling処理

                while (!End)
                {
                    byte[] byt = null;
                    sm.GetMemory(out byt, 0);
                    //int msg = BitConverter.ToInt32(byt, 0);
                    short msg = BitConverter.ToInt16(byt, 0);

                    // 受信メッセージを表示
                    this.SetResult_Svr(
                        string.Format("({0})受信:{1}", managedThreadId, msg.ToString()));

                    Thread.Sleep(0); // Polling間隔
                }

                // Polling停止を表示
                this.SetResult_Svr(
                    string.Format("Polling停止! - ThreadId:{0}", managedThreadId));
            }
            catch (Exception ex)
            {
                // エラーを表示
                this.SetResult_Svr(
                    string.Format("({0})エラー:{1}", managedThreadId, ex.ToString()));
            }
            finally
            {
                if (sm != null)
                {
                    // 共有メモリをクローズ
                    // アンロック&マネージ・アンマネージリソースの解放
                    sm.Close();// ←コメントアウトするとGC任せになるが、ミューテックスの解放が遅れる!
                }
            }
        }
예제 #5
0
        internal override void CloseData()
        {
            _sharedMemory.Close();
            _sharedMemory.Dispose();
            _sharedMemory = null;

            _sharedMemory2.Close();
            _sharedMemory2.Dispose();
            _sharedMemory2 = null;
        }
        /// <summary>サーバ起動 - pollingスレッド関数</summary>
        /// <remarks>unsafeキーワードが必要になる</remarks>
        private void PollingSharedMemory()
        {
            // 共有メモリ(サーバ)
            SharedMemory sm = null;

            // スレッドID
            int managedThreadId = Thread.CurrentThread.ManagedThreadId;

            try
            {
                // 共有メモリを生成
                sm = new SharedMemory("my-sm", 256, "my-mtx");

                // マップ
                sm.Map(0, 0);

                // Polling開始を表示
                this.SetResult_Svr(
                    string.Format("Polling開始! - ThreadId:{0}", managedThreadId));

                // Polling処理

                while (!End)
                {
                    // システム時間、ローカル時間の「Manage SYSTEMTIME構造体」
                    SYSTEMTIME cst = new SYSTEMTIME();

                    byte[] cstBytes  = new byte[Marshal.SizeOf(cst)];
                    byte[] cstsBytes = new byte[Marshal.SizeOf(cst) * 2];

                    // 共有メモリから「Unmanage SYSTEMTIME構造体」配列のバイト表現を読み込む。
                    sm.GetMemory(out cstsBytes, cstsBytes.Length);

                    // マーシャリング(「Unmanage SYSTEMTIME構造体」配列のバイト表現を「Manage SYSTEMTIME構造体」へ変換)

                    //// (1)
                    //object[] os = new object[2];

                    //Array.Copy(cstsBytes, 0, cstBytes, 0, Marshal.SizeOf(cst));
                    //os[0] = CustomMarshaler.BytesToStructure(cstBytes, typeof(SYSTEMTIME));

                    //Array.Copy(cstsBytes, Marshal.SizeOf(cst) * 1, cstBytes, 0, Marshal.SizeOf(cst));
                    //os[1] = CustomMarshaler.BytesToStructure(cstBytes, typeof(SYSTEMTIME));

                    // (2)
                    object[] os = CustomMarshaler.BytesToStructures(cstsBytes, typeof(SYSTEMTIME), 2);

                    SYSTEMTIME[] csts = new SYSTEMTIME[] { (SYSTEMTIME)os[0], (SYSTEMTIME)os[1] };

                    // システム時間
                    string systemTime =
                        string.Format("{0:0000}/{1:00}/{2:00} {3:00}:{4:00}:{5:00}.{6:000}",
                                      csts[0].Year, csts[0].Month, csts[0].Day,
                                      csts[0].Hour, csts[0].Minute, csts[0].Second, csts[0].Milliseconds);

                    // ローカル時間
                    string localTime =
                        string.Format("{0:0000}/{1:00}/{2:00} {3:00}:{4:00}:{5:00}.{6:000}",
                                      csts[1].Year, csts[1].Month, csts[1].Day,
                                      csts[1].Hour, csts[1].Minute, csts[1].Second, csts[1].Milliseconds);

                    // 受信メッセージを表示
                    this.SetResult_Svr(
                        string.Format("({0})受信:{1}", managedThreadId,
                                      "\r\nsystemTime:" + systemTime + "\r\nlocalTime:" + localTime));

                    Thread.Sleep(1000); // Polling間隔
                }

                // Polling停止を表示
                this.SetResult_Svr(
                    string.Format("Polling停止! - ThreadId:{0}", managedThreadId));
            }
            catch (Exception ex)
            {
                // エラーを表示
                this.SetResult_Svr(
                    string.Format("({0})エラー:{1}", managedThreadId, ex.ToString()));
            }
            finally
            {
                if (sm != null)
                {
                    // 共有メモリをクローズ
                    // アンロック&マネージ・アンマネージリソースの解放
                    sm.Close();// ←コメントアウトするとGC任せになるが、ミューテックスの解放が遅れる!
                }
            }
        }
        /// <summary>クライアント生成 - Writeスレッド関数</summary>
        private void WriteSharedMemory()
        {
            // 共有メモリ(サーバ)
            SharedMemory sm = null;

            // スレッドID
            int managedThreadId = Thread.CurrentThread.ManagedThreadId;

            try
            {
                // 共有メモリを生成(256バイト)
                sm = new SharedMemory("my-sm", 256, "my-mtx");

                // マップ
                sm.Map(0, 0);
                // ロック
                sm.Lock();

                // システム時間、ローカル時間の「Manage SYSTEMTIME構造体」
                SYSTEMTIME[] csts = new SYSTEMTIME[2];

                // システム時間
                CmnWin32.GetSystemTime(out csts[0]);
                string systemTime =
                    string.Format("{0:0000}/{1:00}/{2:00} {3:00}:{4:00}:{5:00}.{6:000}",
                                  csts[0].Year, csts[0].Month, csts[0].Day,
                                  csts[0].Hour, csts[0].Minute, csts[0].Second, csts[0].Milliseconds);

                // ローカル時間
                CmnWin32.GetLocalTime(out csts[1]);
                string localTime =
                    string.Format("{0:0000}/{1:00}/{2:00} {3:00}:{4:00}:{5:00}.{6:000}",
                                  csts[1].Year, csts[1].Month, csts[1].Day,
                                  csts[1].Hour, csts[1].Minute, csts[1].Second, csts[1].Milliseconds);

                // 共有メモリを初期化
                sm.SetMemory(CmnClass.InitBuff(256), 256);

                // マーシャリング(「Unmanage SYSTEMTIME構造体」のバイト表現を取得)

                //// (1)
                //SYSTEMTIME cst = new SYSTEMTIME();
                //int sizeCst = Marshal.SizeOf(cst);
                //byte[] cstBytes = new byte[sizeCst];
                //byte[] cstsBytes = new byte[sizeCst * 2];

                //Array.Copy(CustomMarshaler.StructureToBytes(csts[0]), 0, cstsBytes, 0, sizeCst);
                //Array.Copy(CustomMarshaler.StructureToBytes(csts[1]), 0, cstsBytes, sizeCst * 1, sizeCst);

                // (2)
                byte[] cstsBytes = CustomMarshaler.StructuresToBytes(new object[] { csts[0], csts[1] }, 2);

                // 共有メモリへ書き込む。
                sm.SetMemory(cstsBytes, cstsBytes.Length);

                // 送信メッセージを表示
                this.SetResult_Client(
                    string.Format("({0})送信:{1}", managedThreadId,
                                  "\r\nsystemTime:" + systemTime + "\r\nlocalTime:" + localTime));
            }
            catch (Exception ex)
            {
                // エラーを表示
                this.SetResult_Client(
                    string.Format("({0})エラー:{1}", managedThreadId, ex.ToString()));
            }
            finally
            {
                if (sm != null)
                {
                    // 共有メモリをクローズ
                    // アンロック&マネージ・アンマネージリソースの解放
                    sm.Close();// ←コメントアウトするとGC任せになるが、ミューテックスの解放が遅れる!
                }
            }
        }