/// <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(); }
/// <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); } }
/// <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(); }