ipc使用Shared和全局MMF
使用MMF和C#我在2个进程之间创建了一个共享内存。
我的目标是将其创建为全局说长度为4000字节并创建分区
所以Main proj是“MainProj”将启动MMF名为"$AppName$_sharedMMF"
那么“Debugger Proj”将访问"$AppName$_sharedMMF"
因此访问者位置是:
MainProj->Debugger : readAddr = 0 , writeAddr = 250 Debbugger->MainProj : reafAddr = 250, writeAddr = 0
然后我解决方案中的第三个可执行文件将是
//setter getter MainProj->AnotherExe : readAddr = 251 , writeAddr = 500 //setter getter EnotherExe->MainProj : reafAddr = 500, writeAddr = 251
我面临的问题是,我希望mainProj成为MMF的全局实例
所以每次我想访问分区我都会使用相同的静态类和方法
//accessed by main project SharedSetter(SelectedGetter, Data)
1)因为它由多个线程共享它有点复杂,虽然添加分区并不像整个设置那样复杂,这是一个坏主意吗?
2)我是否真的不能跳过mmf的创建新实例步骤并将其保留为“Alive”并仅创建新的访问器?
3)是否有人实施了该方法?
static void Main(string[] args) { FsMomitorIPCCarier data = new FsMomitorIPCCarier("someData"); IpcAccessorSetting curSrv = new IpcAccessorSetting(IPChannelS.FsMonitor, IpcAccessorThreadNameS.FsmonitorThrd, 0, 2000); MMFDepositT FsMonitorSetterDepo = null; try { FsMonitorSetterDepo = new MMFDepositT(curSrv.Channel.ToString(),curSrv.AccThreadName.ToString(), 4096); FsMonitorSetterDepo.ReadPosition = curSrv.AccessorSectorsSets.DepoSects.Setter.Read; FsMonitorSetterDepo.WritePosition =curSrv.AccessorSectorsSets.DepoSects.Setter.Write; Console.WriteLine("MonitorSetterDepo.ReadPosition " + FsMonitorSetterDepo.ReadPosition); Console.WriteLine("MonitorSetterDepo.WritePosition " + FsMonitorSetterDepo.WritePosition); FsMonitorSetterDepo.DataReceived += new EventHandler(FsMonitorSetter_DataReceived); FsMonitorSetterDepo.StartReader(); } catch (Exception e) { Console.ForegroundColor = ConsoleColor.Red; Console.WriteLine("MonitorSetterDepo ctor: " + e.Message); } Console.ForegroundColor = ConsoleColor.Magenta; Console.WriteLine("MonitorSetterDepo is now online"); var msg = data.DipositStrVal.StrValue.Val; Console.WriteLine("Data = " + msg); bool quit = false; while (!quit) { Console.ReadLine(); if (!string.IsNullOrEmpty(msg)) { var dataDelvr = data.IpcCarierToByteArray(); FsMonitorSetterDepo.Write(dataDelvr); } else { quit = true; } //msg = ""; } //DepoTest.statusSet.ForEach(SttM => Console.WriteLine(SttM)); FsMonitorSetterDepo.Close(); FsMonitorSetterDepo = null; }