/// <summary> /// 将共享内存传递的计算结果转换为GridStrength /// </summary> /// <param name="ret"></param> /// <returns></returns> private GridStrength convertFromMMFGSStruct(MMFGSStruct ret) { GridStrength gs = new GridStrength(); gs.GXID = ret.GXID; gs.GYID = ret.GYID; gs.Level = ret.Level; gs.GCenter = new LTE.Geometric.Point(ret.x, ret.y, ret.z); gs.eNodeB = ret.eNodeB; gs.CI = ret.CI; gs.FieldIntensity = ret.FieldIntensity; gs.DirectNum = ret.DirectNum; gs.DirectPwrW = ret.DirectPwrW; gs.MaxDirectPwrW = ret.MaxDirectPwrW; gs.RefNum = ret.RefNum; gs.RefPwrW = ret.RefPwrW; gs.MaxRefPwrW = ret.MaxRefPwrW; gs.RefBuildingID = ret.RefBuildingID; gs.DiffNum = ret.DiffNum; gs.DiffPwrW = ret.DiffPwrW; gs.MaxDiffPwrW = ret.MaxDiffPwrW; gs.DiffBuildingID = ret.DiffBuildingID; gs.TransNum = ret.TransNum; gs.TransPwrW = ret.TransPwrW; gs.MaxTransPwrW = ret.MaxTransPwrW; gs.TransmitBuildingID = ret.TransmitBuildingID; gs.BTSGridDistance = ret.BTSGridDistance; gs.ReceivedPowerW = ret.ReceivedPowerW; gs.ReceivedPowerdbm = ret.ReceivedPowerdbm; gs.PathLoss = ret.PathLoss; gs.ground = ret.ground; return(gs); }
private void readCalcResultAsync(IntPtr Chandle, int dataSize) { //-1代表子进程写入共享内存失败 if (dataSize == -1) { Console.WriteLine(string.Format("Write mmf {0} failed", Chandle)); System.Environment.Exit(2); } //0代表当前共享内存中不存在数据,则直接返回,且让++this.procDoneNum if (dataSize == 0) { Console.WriteLine(string.Format("当前批{0}没有数据", Chandle)); if (++this.procDoneNum == this.processNum) { Task.Run(() => { writeResToDb(); }); } return; } DateTime t1, t2; t1 = DateTime.Now; Console.WriteLine(string.Format("read params :child handle = {0}, data size = {1}", Chandle, dataSize)); string shareName = this.getMMFName(Chandle); Console.WriteLine(string.Format("read child outcome :{0}", shareName)); IntPtr mmf = IntPtr.Zero; try { mmf = MMF.OpenFileMapping(MMF.FileMapAccess.FileMapRead, false, shareName); Console.WriteLine("open file ..."); } catch (Exception e) { //MessageBox.Show(string.Format("open mmf {0} failed, error : {1}", shareName, e.Message)); Console.WriteLine(string.Format("open mmf {0} failed, error : {1}", shareName, e.Message)); System.Environment.Exit(2); } if (IntPtr.Zero == mmf) { //MessageBox.Show(string.Format("共享内存<{0}>打开失败,错误信息编号:{1}", shareName, MMF.GetLastError())); Console.WriteLine(string.Format("共享内存<{0}>打开失败,错误信息编号:{1}", shareName, MMF.GetLastError())); System.Environment.Exit(2); return; } IntPtr reader = IntPtr.Zero; try { reader = MMF.MapViewOfFile(mmf, MMF.FileMapAccess.FileMapRead, 0, 0, (uint)dataSize); Console.WriteLine("map view ..."); } catch (Exception e) { Console.WriteLine("map view failed"); System.Environment.Exit(2); return; } if (reader == IntPtr.Zero) { //MessageBox.Show(string.Format("共享内存<{0}>映射失败,错误信息编号:{1}", shareName, MMF.GetLastError())); Console.WriteLine(string.Format("共享内存<{0}>映射失败,错误信息编号:{1}", shareName, MMF.GetLastError())); System.Environment.Exit(2); return; } IntPtr tp = IntPtr.Zero; Type type = typeof(MMFGSStruct); int ssize = Marshal.SizeOf(type); Console.WriteLine("ssize = " + ssize); //tp = new IntPtr(reader.ToInt64()); MMFGSStruct data = new MMFGSStruct(); long sp = reader.ToInt64(); for (int dsize = 0; dsize < dataSize; dsize += ssize) { try { tp = new IntPtr(sp + dsize); data = (MMFGSStruct)Marshal.PtrToStructure(tp, typeof(MMFGSStruct)); // convertFromMMFGSStruct 将共享内存传递的计算结果转换为GridStrength this.MultiTasksGridStrengths.Add(convertFromMMFGSStruct(data)); } catch (Exception e) { Console.WriteLine(string.Format("read error : tp = {0}, dsize = {1}, msg = {2}", tp.ToInt64(), dsize, e.Message)); System.Environment.Exit(2); //MessageBox.Show(string.Format("read error : tp = {0}, dsize = {1}, msg = {2}", tp.ToInt32(), dsize, e.Message)); } } Console.WriteLine("after read...."); MMF.UnmapViewOfFile(reader); MMF.CloseHandle(mmf); mmf = reader = IntPtr.Zero; t2 = DateTime.Now; Console.WriteLine(string.Format("read {0} done. now total : {1}, using time: {2}", shareName, this.MultiTasksGridStrengths.Count, (t2 - t1).TotalMilliseconds)); Console.WriteLine("**********************************************************************"); this.procDoneNum++; Console.WriteLine(String.Format("已处理{0}/{1}个进程", this.procDoneNum, this.processNum)); Console.WriteLine("**********************************************************************"); //this.outGSs(); //if (++this.procDoneNum == Math.Min(this.maxProcNum, this.processNum - this.procDoneNum1)) if (this.procDoneNum == this.processNum) { Task.Run(() => { writeResToDb(); }); RedisMq.Pub("rayTrace_finish", this.cellInfo.eNodeB); } }