Example #1
0
 /// <summary>
 ///
 /// </summary>
 /// <param name="startTime"></param>
 /// <param name="memory"></param>
 public void RequestToSave(DateTime startTime, DateTime endTime, CachMemoryBlock memory)
 {
     mNeedSaveMemory1 = memory;
     mStartTime       = startTime;
     mEndTime         = endTime;
     resetEvent.Set();
 }
Example #2
0
        /// <summary>
        /// 提交内存数据到合并
        /// </summary>
        private void SubmiteMemory(DateTime dateTime)
        {
            int number = MergeMemoryTime / CachMemoryTime;

            var mcc = mCurrentMemory;

            mMergeCount++;

            mMergeCount = mMergeCount >= number ? 0 : mMergeCount;

            //HisRunTag.TimerOffset = mMergeCount * 10 * CachMemoryTime;

            if (mCurrentMemory == mCachMemory1)
            {
                CheckMemoryIsReady(mCachMemory2);
                CurrentMemory = mCachMemory2;
            }
            else
            {
                CheckMemoryIsReady(mCachMemory1);
                CurrentMemory = mCachMemory1;
            }

            CurrentMemory.CurrentDatetime = dateTime;

            if (mMergeCount == 0)
            {
                mNeedSnapAllTag = true;
                LoggerService.Service.Info("HisEnginer", "使用新的时间起点:" + CurrentMemory.Name + "  " + formateDatetime(CurrentMemory.CurrentDatetime), ConsoleColor.Cyan);
                HisRunTag.StartTime = dateTime;
            }
            //PrepareForReadyMemory();
            foreach (var vv in mHisTags.Values)
            {
                vv.Reset();
            }

            if (mcc != null)
            {
                mcc.MakeMemoryBusy();
                mWaitForMergeMemory = mcc;
                //通知进行内存合并
                resetEvent.Set();

                mLogManager?.RequestToSave(mcc.CurrentDatetime, dateTime, mcc);
            }
        }
Example #3
0
        /// <summary>
        /// 分配内存
        /// </summary>
        private void AllocMemory()
        {
            /*
             * 数据块:数据块头+数据
             * 数据块头:质量戳偏移+id
             * 数据:[时间戳]+[值]+[质量戳]
             */
            long storeHeadSize = 0;

            long cachHeadSize  = 0;
            int  blockheadsize = 0;
            int  qulityOffset  = 0;
            int  valueOffset   = 0;

            Dictionary <int, Tuple <long, int, int, int> > addressoffset = new Dictionary <int, Tuple <long, int, int, int> >();

            foreach (var vv in mHisTags)
            {
                var ss = CalMergeBlockSize(vv.Value.TagType, vv.Value.Type, blockheadsize, out valueOffset, out qulityOffset);

                addressoffset.Add(vv.Value.Id, new Tuple <long, int, int, int>(storeHeadSize, valueOffset, qulityOffset, ss));
                storeHeadSize += ss;

                var css = CalCachDatablockSize(vv.Value.TagType, vv.Value.Type, blockheadsize, out valueOffset, out qulityOffset);

                vv.Value.BlockHeadStartAddr = cachHeadSize;

                vv.Value.TimerValueStartAddr = vv.Value.BlockHeadStartAddr;

                vv.Value.HisValueStartAddr = vv.Value.BlockHeadStartAddr + valueOffset;

                vv.Value.HisQulityStartAddr = vv.Value.BlockHeadStartAddr + qulityOffset;

                vv.Value.DataSize = css;
                cachHeadSize     += css;
                //vv.Value.Init();
            }

            mMergeMemory = new MergeMemoryBlock(storeHeadSize)
            {
                Name = "StoreMemory", TagAddress = addressoffset
            };

            mCachMemory1 = new CachMemoryBlock(cachHeadSize)
            {
                Name = "CachMemory1"
            };
            mCachMemory2 = new CachMemoryBlock(cachHeadSize)
            {
                Name = "CachMemory2"
            };

            LoggerService.Service.Info("HisEnginer", "Cal MergeMemory memory size:" + (storeHeadSize / 1024.0 / 1024) + "M", ConsoleColor.Cyan);
            LoggerService.Service.Info("HisEnginer", "Cal CachMemoryBlock memory size:" + (cachHeadSize / 1024.0 / 1024 * 2) + "M", ConsoleColor.Cyan);

            CurrentMemory = mCachMemory1;

            mCachMemory1.Clear();
            mCachMemory2.Clear();
            mMergeMemory.Clear();
        }