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任せになるが、ミューテックスの解放が遅れる! } } }
void Profile_ProfileStopped(object sender, EventArgs e) { _textureMemory.Close(); _textureMemory.Dispose(); _textureMemory = null; IsRunning = false; }
/// <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任せになるが、ミューテックスの解放が遅れる! } } }
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任せになるが、ミューテックスの解放が遅れる! } } }