From 4bee499ba75615d9e244af2845e6c4176bd009eb Mon Sep 17 00:00:00 2001 From: Candy Date: Wed, 6 May 2020 23:29:41 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E9=80=80=E5=87=BA=E4=BF=9D?= =?UTF-8?q?=E5=AD=98=E6=95=B0=E6=8D=AE=E5=8A=9F=E8=83=BD=E3=80=82=E4=BB=A5?= =?UTF-8?q?=E5=8F=8ASim=E4=BB=BF=E7=9C=9F=E5=A4=9A=E7=BA=BF=E7=A8=8B?= =?UTF-8?q?=E8=B5=8B=E5=80=BC=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- DBHisData/HisQuery/TimeFile/DataFileInfo.cs | 9 ++- DBInRun/Program.cs | 8 ++- DataRunner/His/Compress/CompressEnginer.cs | 7 ++- DataRunner/His/Compress/CompressMemory.cs | 4 +- DataRunner/His/HisEnginer.cs | 40 +++++++++++-- DataRunner/His/LogManager.cs | 2 + DataRunner/His/Serise/SeriseEnginer.cs | 14 +++-- DataRunner/His/TimerMemoryCacheProcesser.cs | 27 +++++++-- .../His/ValueChangedMemoryCacheProcesser.cs | 3 +- SimDriver/Driver.cs | 59 +++++++++++-------- 10 files changed, 127 insertions(+), 46 deletions(-) diff --git a/DBHisData/HisQuery/TimeFile/DataFileInfo.cs b/DBHisData/HisQuery/TimeFile/DataFileInfo.cs index be2b1b6..e2eb2db 100644 --- a/DBHisData/HisQuery/TimeFile/DataFileInfo.cs +++ b/DBHisData/HisQuery/TimeFile/DataFileInfo.cs @@ -91,7 +91,14 @@ namespace Cdy.Tag Scan(); } - DataFileManager.CurrentDateTime.Add(FId, mLastTime); + if (DataFileManager.CurrentDateTime.ContainsKey(FId)) + { + DataFileManager.CurrentDateTime[FId] = mLastTime; + } + else + { + DataFileManager.CurrentDateTime.Add(FId, mLastTime); + } } diff --git a/DBInRun/Program.cs b/DBInRun/Program.cs index a74481b..63f31a2 100644 --- a/DBInRun/Program.cs +++ b/DBInRun/Program.cs @@ -23,11 +23,17 @@ namespace DBInRun } } + + Console.WriteLine(Res.Get("HelpMsg")); while (!mIsClosed) { Console.Write(">"); - string[] cmd = Console.ReadLine().Split(new string[] { " " }, StringSplitOptions.RemoveEmptyEntries); + + string smd = Console.ReadLine(); + if (string.IsNullOrEmpty(smd)) continue; + + string[] cmd = smd.Split(new string[] { " " }, StringSplitOptions.RemoveEmptyEntries); if (cmd.Length == 0) continue; diff --git a/DataRunner/His/Compress/CompressEnginer.cs b/DataRunner/His/Compress/CompressEnginer.cs index b97df5a..d2e62ee 100644 --- a/DataRunner/His/Compress/CompressEnginer.cs +++ b/DataRunner/His/Compress/CompressEnginer.cs @@ -123,6 +123,7 @@ namespace Cdy.Tag /// public void Start() { + mIsClosed = false; mHisTagService = ServiceLocator.Locator.Resolve(); Init(); @@ -139,7 +140,7 @@ namespace Cdy.Tag /// public void Stop() { - mIsClosed = false; + mIsClosed = true; resetEvent.Set(); closedEvent.WaitOne(); @@ -151,6 +152,7 @@ namespace Cdy.Tag foreach(var vv in mTargetMemorys) { + while (vv.Value.IsBusy()) Thread.Sleep(1); vv.Value.Dispose(); } mTargetMemorys.Clear(); @@ -236,6 +238,9 @@ namespace Cdy.Tag } closedEvent.Set(); + + LoggerService.Service.Info("Compress", "压缩线程退出!"); + } #endregion ...Methods... diff --git a/DataRunner/His/Compress/CompressMemory.cs b/DataRunner/His/Compress/CompressMemory.cs index 27e6258..33a78dc 100644 --- a/DataRunner/His/Compress/CompressMemory.cs +++ b/DataRunner/His/Compress/CompressMemory.cs @@ -168,6 +168,8 @@ namespace Cdy.Tag Dictionary dtmp = new Dictionary(); + this.MakeMemoryBusy(); + //更新数据区域 foreach(var vv in mTagAddress) { @@ -192,7 +194,7 @@ namespace Cdy.Tag ServiceLocator.Locator.Resolve().RequestToSeriseFile(this, mCurrentTime); sw.Stop(); - LoggerService.Service.Info("SeriseEnginer", Id+ "压缩完成 耗时:"+sw.ElapsedMilliseconds); + LoggerService.Service.Info("CompressEnginer", Id+ "压缩完成 耗时:"+sw.ElapsedMilliseconds); } /// diff --git a/DataRunner/His/HisEnginer.cs b/DataRunner/His/HisEnginer.cs index 0f04b75..cd57364 100644 --- a/DataRunner/His/HisEnginer.cs +++ b/DataRunner/His/HisEnginer.cs @@ -120,8 +120,13 @@ namespace Cdy.Tag private int mMergeCount = 0; private bool mNeedSnapAllTag=false; + private DateTime mSnapAllTagTime = DateTime.Now; + private bool mForceSubmiteToCompress = false; + + private bool mMegerProcessIsClosed = false; + #endregion ...Variables... #region ... Events ... @@ -497,7 +502,7 @@ namespace Cdy.Tag public void Start() { mIsClosed = false; - + mMegerProcessIsClosed = false; if (LogManager != null) { LogManager.InitHeadData(this.mHisTags); @@ -563,7 +568,7 @@ namespace Cdy.Tag { resetEvent.WaitOne(); resetEvent.Reset(); - if (mIsClosed) return; + //if (mIsClosed) return; if(mNeedSnapAllTag) { @@ -575,7 +580,7 @@ namespace Cdy.Tag //如果合并满了,则提交给压缩流程进行压缩 count++; - if(count>=number) + if(count>=number || mForceSubmiteToCompress) { if (mMergeMemory != null) @@ -585,7 +590,7 @@ namespace Cdy.Tag mMergeMemory.MakeMemoryBusy(); //提交到数据压缩流程 ServiceLocator.Locator.Resolve().RequestToCompress(mMergeMemory); - LoggerService.Service.Info("Record", "提交内存 " + mMergeMemory.Name + " 进行压缩",ConsoleColor.Green); + LoggerService.Service.Info("HisEnginer", "提交内存 " + mMergeMemory.Name + " 进行压缩",ConsoleColor.Green); //等待压缩完成 while(mMergeMemory.IsBusy()) Thread.Sleep(1); @@ -594,6 +599,9 @@ namespace Cdy.Tag count = 0; } } + LoggerService.Service.Info("HisEnginer", "合并线程退出!" , ConsoleColor.Green); + + mMegerProcessIsClosed = true; } /// @@ -834,15 +842,29 @@ namespace Cdy.Tag mIsBusy = false; } + /// /// /// - public void Stop() + private void SubmitLastDataToSave() { + mNeedSnapAllTag = true; + mForceSubmiteToCompress = true; mIsClosed = true; + SubmiteMemory(DateTime.Now); + while (!mMegerProcessIsClosed) Thread.Sleep(1); + } + + + /// + /// + /// + public void Stop() + { mRecordTimer.Stop(); if(mRecordTimer!=null) { + mRecordTimer.Elapsed -= MRecordTimer_Elapsed; mRecordTimer.Dispose(); mRecordTimer = null; } @@ -858,16 +880,22 @@ namespace Cdy.Tag vv.Stop(); vv.Dispose(); } + mValueChangedProcesser.Clear(); if (LogManager != null) LogManager.Stop(); - mValueChangedProcesser.Clear(); + SubmitLastDataToSave(); + + mIsClosed = true; mLastValueChangedProcesser = null; mLastProcesser = null; mHisTags.Clear(); + mCachMemory1?.Dispose(); + mCachMemory2?.Dispose(); + mMergeMemory?.Dispose(); } /// diff --git a/DataRunner/His/LogManager.cs b/DataRunner/His/LogManager.cs index 28ebeff..4857b0c 100644 --- a/DataRunner/His/LogManager.cs +++ b/DataRunner/His/LogManager.cs @@ -195,6 +195,8 @@ namespace Cdy.Tag LoggerService.Service.Info("LogManager", "记录"+ mNeedSaveMemory1.Name +"到日志文件 耗时" + sw.ElapsedMilliseconds + " "); } closedEvent.Set(); + LoggerService.Service.Info("LogManager", "退出!"); + } /// diff --git a/DataRunner/His/Serise/SeriseEnginer.cs b/DataRunner/His/Serise/SeriseEnginer.cs index 2f3235d..be6700e 100644 --- a/DataRunner/His/Serise/SeriseEnginer.cs +++ b/DataRunner/His/Serise/SeriseEnginer.cs @@ -56,7 +56,7 @@ namespace Cdy.Tag private DateTime mCurrentTime; - private SeriseFileItem[] mSeriseFile; + //private SeriseFileItem[] mSeriseFile; private Dictionary mWaitForProcessMemory = new Dictionary(); @@ -205,6 +205,7 @@ namespace Cdy.Tag /// public void Start() { + mIsClosed = false; Init(); resetEvent = new ManualResetEvent(false); closedEvent = new ManualResetEvent(false); @@ -218,14 +219,17 @@ namespace Cdy.Tag /// public void Stop() { - mIsClosed = false; + mIsClosed = true; resetEvent.Set(); closedEvent.WaitOne(); - foreach (var vv in mSeriseFile) + if (mSeriserFiles != null) { - vv.Dispose(); + foreach (var vv in mSeriserFiles) + { + vv.Value.Dispose(); + } + mSeriserFiles.Clear(); } - mSeriseFile = null; resetEvent.Dispose(); closedEvent.Dispose(); diff --git a/DataRunner/His/TimerMemoryCacheProcesser.cs b/DataRunner/His/TimerMemoryCacheProcesser.cs index 9c27bcf..bae2a97 100644 --- a/DataRunner/His/TimerMemoryCacheProcesser.cs +++ b/DataRunner/His/TimerMemoryCacheProcesser.cs @@ -11,6 +11,7 @@ using System.Collections.Generic; using System.Text; using System.Threading; using System.Linq; +using System.Diagnostics; namespace Cdy.Tag { @@ -33,7 +34,7 @@ namespace Cdy.Tag /// private Dictionary mCount = new Dictionary(); - public const int MaxTagCount = 100000; + public const int MaxTagCount = 50000; private int mCurrentCount = 0; @@ -99,7 +100,8 @@ namespace Cdy.Tag if (mIsBusy) { mBusyCount++; - if(Id==0) + //if(Id==0) + if(mBusyCount>4) LoggerService.Service.Warn("Record", "TimerMemoryCacheProcesser"+Id+" 出现阻塞:"+mBusyCount); } else @@ -127,7 +129,7 @@ namespace Cdy.Tag { mIsClosed = true; resetEvent.Set(); - closedEvent.WaitOne(1000); + closedEvent.WaitOne(); } /// @@ -167,7 +169,7 @@ namespace Cdy.Tag mCount.Clear(); mCurrentCount = 0; } - + /// /// @@ -184,6 +186,7 @@ namespace Cdy.Tag try { mIsBusy = true; + foreach (var vv in vkeys) { mCount[vv] += HisEnginer.MemoryTimeTick; @@ -193,6 +196,7 @@ namespace Cdy.Tag ProcessTags(mTimerTags[vv]); } } + mIsBusy = false; } catch @@ -202,6 +206,8 @@ namespace Cdy.Tag resetEvent.Reset(); } closedEvent.Set(); + LoggerService.Service.Info("TimerMemoryCacheProcesser", Id + " 退出"); + } @@ -211,11 +217,24 @@ namespace Cdy.Tag /// private void ProcessTags(List tags) { + //Stopwatch sw = new Stopwatch(); + //sw.Start(); + int tim = (int)((mLastUpdateTime - HisRunTag.StartTime).TotalMilliseconds / HisEnginer.MemoryTimeTick); + //System.Threading.Tasks.Parallel.ForEach(tags, (vv) => + //{ + // vv.UpdateValue(tim); + //}); foreach (var vv in tags) { vv.UpdateValue(tim); } + + + //{ + //sw.Stop(); + // LoggerService.Service.Info("ProcessTags", "TimerMemoryCacheProcesser" + Id + " 处理变量:" +tags.Count+" " + sw.ElapsedMilliseconds); + //} } /// diff --git a/DataRunner/His/ValueChangedMemoryCacheProcesser.cs b/DataRunner/His/ValueChangedMemoryCacheProcesser.cs index b2cc6b3..01f8cf0 100644 --- a/DataRunner/His/ValueChangedMemoryCacheProcesser.cs +++ b/DataRunner/His/ValueChangedMemoryCacheProcesser.cs @@ -129,7 +129,7 @@ namespace Cdy.Tag { mIsClosed = true; resetEvent.Set(); - closedEvent.WaitOne(1000); + closedEvent.WaitOne(); } /// @@ -261,6 +261,7 @@ namespace Cdy.Tag resetEvent.Reset(); } closedEvent.Set(); + LoggerService.Service.Info("ValueChangedMemoryCacheProcesser", Name + " 退出"); } /// diff --git a/SimDriver/Driver.cs b/SimDriver/Driver.cs index ce7b893..65a38e1 100644 --- a/SimDriver/Driver.cs +++ b/SimDriver/Driver.cs @@ -27,6 +27,8 @@ namespace SimDriver private DateTime mLastProcessTime = DateTime.Now; + private int mBusyCount = 0; + #endregion ...Variables... #region ... Events ... @@ -113,29 +115,49 @@ namespace SimDriver if (mIsBusy) { + mBusyCount++; + if(mBusyCount>=10) LoggerService.Service.Warn("Sim Driver", "出现阻塞"); return; } + mBusyCount = 0; mIsBusy = true; DateTime time = DateTime.Now; if ((time - mLastProcessTime).Seconds < 1) { + mIsBusy = false; return; } mLastProcessTime = time; mNumber++; mNumber = mNumber > (short)360 ? (short)0 : mNumber; - //#if DEBUG - // Stopwatch sw = new Stopwatch(); - // sw.Start(); - //#endif +//#if DEBUG +// Stopwatch sw = new Stopwatch(); +// sw.Start(); +//#endif double fval = Math.Cos(mNumber / 180.0 * Math.PI); double sval = Math.Sin(mNumber / 180.0 * Math.PI); - Log("Sim:Sin " + fval + " " + "Sim:Cos " + sval + " "+ "Sim:step " + mNumber +" "+ DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff")); + Log("Sim:Sin " + fval + " " + "Sim:Cos " + sval + " " + "Sim:step " + mNumber + " " + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff")); + + //foreach (var vv in mTagIdCach) + //{ + // if (vv.Key == "Sim:cos") + // { + // mTagService.SetTagValue(vv.Value, fval); + // } + // else if (vv.Key == "Sim:sin") + // { + // mTagService.SetTagValue(vv.Value, sval); + // } + // else if (vv.Key == "Sim:step") + // { + // mTagService.SetTagValue(vv.Value, mNumber); + // } + //} - foreach (var vv in mTagIdCach) + System.Threading.Tasks.Parallel.ForEach(mTagIdCach, (vv) => { if (vv.Key == "Sim:cos") { @@ -149,28 +171,13 @@ namespace SimDriver { mTagService.SetTagValue(vv.Value, mNumber); } - } - - //System.Threading.Tasks.Parallel.ForEach(mTagIdCach, (vv) => { - // if (vv.Key == "Sim:cos") - // { - // mTagService.SetTagValue(vv.Value, fval); - // } - // else if (vv.Key == "Sim:sin") - // { - // mTagService.SetTagValue(vv.Value, sval); - // } - // else if (vv.Key == "Sim:step") - // { - // mTagService.SetTagValue(vv.Value, mNumber); - // } - //}); + }); - //#if DEBUG - // sw.Stop(); +//#if DEBUG +// sw.Stop(); - // LoggerService.Service.Info("Sim Driver","set value elapsed:"+ sw.ElapsedMilliseconds +" total count:"+mNumber+" cos:"+ Math.Cos(mNumber / 180.0 * Math.PI)+" sin:"+ Math.Sin(mNumber / 180.0 * Math.PI)); - //#endif +// LoggerService.Service.Info("Sim Driver", "set value elapsed:" + sw.ElapsedMilliseconds + " total count:" + mNumber + " cos:" + Math.Cos(mNumber / 180.0 * Math.PI) + " sin:" + Math.Sin(mNumber / 180.0 * Math.PI)); +//#endif mIsBusy = false; } -- GitLab