Exemplo n.º 1
0
        /// <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);
        }
Exemplo n.º 2
0
        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);
            }
        }