提交 4bee499b 编写于 作者: cdy816's avatar cdy816

增加退出保存数据功能。以及Sim仿真多线程赋值。

上级 b444ee29
...@@ -91,7 +91,14 @@ namespace Cdy.Tag ...@@ -91,7 +91,14 @@ namespace Cdy.Tag
Scan(); Scan();
} }
DataFileManager.CurrentDateTime.Add(FId, mLastTime); if (DataFileManager.CurrentDateTime.ContainsKey(FId))
{
DataFileManager.CurrentDateTime[FId] = mLastTime;
}
else
{
DataFileManager.CurrentDateTime.Add(FId, mLastTime);
}
} }
......
...@@ -23,11 +23,17 @@ namespace DBInRun ...@@ -23,11 +23,17 @@ namespace DBInRun
} }
} }
Console.WriteLine(Res.Get("HelpMsg")); Console.WriteLine(Res.Get("HelpMsg"));
while (!mIsClosed) while (!mIsClosed)
{ {
Console.Write(">"); 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; if (cmd.Length == 0) continue;
......
...@@ -123,6 +123,7 @@ namespace Cdy.Tag ...@@ -123,6 +123,7 @@ namespace Cdy.Tag
/// </summary> /// </summary>
public void Start() public void Start()
{ {
mIsClosed = false;
mHisTagService = ServiceLocator.Locator.Resolve<IHisEngine>(); mHisTagService = ServiceLocator.Locator.Resolve<IHisEngine>();
Init(); Init();
...@@ -139,7 +140,7 @@ namespace Cdy.Tag ...@@ -139,7 +140,7 @@ namespace Cdy.Tag
/// </summary> /// </summary>
public void Stop() public void Stop()
{ {
mIsClosed = false; mIsClosed = true;
resetEvent.Set(); resetEvent.Set();
closedEvent.WaitOne(); closedEvent.WaitOne();
...@@ -151,6 +152,7 @@ namespace Cdy.Tag ...@@ -151,6 +152,7 @@ namespace Cdy.Tag
foreach(var vv in mTargetMemorys) foreach(var vv in mTargetMemorys)
{ {
while (vv.Value.IsBusy()) Thread.Sleep(1);
vv.Value.Dispose(); vv.Value.Dispose();
} }
mTargetMemorys.Clear(); mTargetMemorys.Clear();
...@@ -236,6 +238,9 @@ namespace Cdy.Tag ...@@ -236,6 +238,9 @@ namespace Cdy.Tag
} }
closedEvent.Set(); closedEvent.Set();
LoggerService.Service.Info("Compress", "压缩线程退出!");
} }
#endregion ...Methods... #endregion ...Methods...
......
...@@ -168,6 +168,8 @@ namespace Cdy.Tag ...@@ -168,6 +168,8 @@ namespace Cdy.Tag
Dictionary<int, long> dtmp = new Dictionary<int, long>(); Dictionary<int, long> dtmp = new Dictionary<int, long>();
this.MakeMemoryBusy();
//更新数据区域 //更新数据区域
foreach(var vv in mTagAddress) foreach(var vv in mTagAddress)
{ {
...@@ -192,7 +194,7 @@ namespace Cdy.Tag ...@@ -192,7 +194,7 @@ namespace Cdy.Tag
ServiceLocator.Locator.Resolve<IDataSerialize>().RequestToSeriseFile(this, mCurrentTime); ServiceLocator.Locator.Resolve<IDataSerialize>().RequestToSeriseFile(this, mCurrentTime);
sw.Stop(); sw.Stop();
LoggerService.Service.Info("SeriseEnginer", Id+ "压缩完成 耗时:"+sw.ElapsedMilliseconds); LoggerService.Service.Info("CompressEnginer", Id+ "压缩完成 耗时:"+sw.ElapsedMilliseconds);
} }
/// <summary> /// <summary>
......
...@@ -120,8 +120,13 @@ namespace Cdy.Tag ...@@ -120,8 +120,13 @@ namespace Cdy.Tag
private int mMergeCount = 0; private int mMergeCount = 0;
private bool mNeedSnapAllTag=false; private bool mNeedSnapAllTag=false;
private DateTime mSnapAllTagTime = DateTime.Now; private DateTime mSnapAllTagTime = DateTime.Now;
private bool mForceSubmiteToCompress = false;
private bool mMegerProcessIsClosed = false;
#endregion ...Variables... #endregion ...Variables...
#region ... Events ... #region ... Events ...
...@@ -497,7 +502,7 @@ namespace Cdy.Tag ...@@ -497,7 +502,7 @@ namespace Cdy.Tag
public void Start() public void Start()
{ {
mIsClosed = false; mIsClosed = false;
mMegerProcessIsClosed = false;
if (LogManager != null) if (LogManager != null)
{ {
LogManager.InitHeadData(this.mHisTags); LogManager.InitHeadData(this.mHisTags);
...@@ -563,7 +568,7 @@ namespace Cdy.Tag ...@@ -563,7 +568,7 @@ namespace Cdy.Tag
{ {
resetEvent.WaitOne(); resetEvent.WaitOne();
resetEvent.Reset(); resetEvent.Reset();
if (mIsClosed) return; //if (mIsClosed) return;
if(mNeedSnapAllTag) if(mNeedSnapAllTag)
{ {
...@@ -575,7 +580,7 @@ namespace Cdy.Tag ...@@ -575,7 +580,7 @@ namespace Cdy.Tag
//如果合并满了,则提交给压缩流程进行压缩 //如果合并满了,则提交给压缩流程进行压缩
count++; count++;
if(count>=number) if(count>=number || mForceSubmiteToCompress)
{ {
if (mMergeMemory != null) if (mMergeMemory != null)
...@@ -585,7 +590,7 @@ namespace Cdy.Tag ...@@ -585,7 +590,7 @@ namespace Cdy.Tag
mMergeMemory.MakeMemoryBusy(); mMergeMemory.MakeMemoryBusy();
//提交到数据压缩流程 //提交到数据压缩流程
ServiceLocator.Locator.Resolve<IDataCompress>().RequestToCompress(mMergeMemory); ServiceLocator.Locator.Resolve<IDataCompress>().RequestToCompress(mMergeMemory);
LoggerService.Service.Info("Record", "提交内存 " + mMergeMemory.Name + " 进行压缩",ConsoleColor.Green); LoggerService.Service.Info("HisEnginer", "提交内存 " + mMergeMemory.Name + " 进行压缩",ConsoleColor.Green);
//等待压缩完成 //等待压缩完成
while(mMergeMemory.IsBusy()) Thread.Sleep(1); while(mMergeMemory.IsBusy()) Thread.Sleep(1);
...@@ -594,6 +599,9 @@ namespace Cdy.Tag ...@@ -594,6 +599,9 @@ namespace Cdy.Tag
count = 0; count = 0;
} }
} }
LoggerService.Service.Info("HisEnginer", "合并线程退出!" , ConsoleColor.Green);
mMegerProcessIsClosed = true;
} }
/// <summary> /// <summary>
...@@ -834,15 +842,29 @@ namespace Cdy.Tag ...@@ -834,15 +842,29 @@ namespace Cdy.Tag
mIsBusy = false; mIsBusy = false;
} }
/// <summary> /// <summary>
/// ///
/// </summary> /// </summary>
public void Stop() private void SubmitLastDataToSave()
{ {
mNeedSnapAllTag = true;
mForceSubmiteToCompress = true;
mIsClosed = true; mIsClosed = true;
SubmiteMemory(DateTime.Now);
while (!mMegerProcessIsClosed) Thread.Sleep(1);
}
/// <summary>
///
/// </summary>
public void Stop()
{
mRecordTimer.Stop(); mRecordTimer.Stop();
if(mRecordTimer!=null) if(mRecordTimer!=null)
{ {
mRecordTimer.Elapsed -= MRecordTimer_Elapsed;
mRecordTimer.Dispose(); mRecordTimer.Dispose();
mRecordTimer = null; mRecordTimer = null;
} }
...@@ -858,16 +880,22 @@ namespace Cdy.Tag ...@@ -858,16 +880,22 @@ namespace Cdy.Tag
vv.Stop(); vv.Stop();
vv.Dispose(); vv.Dispose();
} }
mValueChangedProcesser.Clear();
if (LogManager != null) LogManager.Stop(); if (LogManager != null) LogManager.Stop();
mValueChangedProcesser.Clear(); SubmitLastDataToSave();
mIsClosed = true;
mLastValueChangedProcesser = null; mLastValueChangedProcesser = null;
mLastProcesser = null; mLastProcesser = null;
mHisTags.Clear(); mHisTags.Clear();
mCachMemory1?.Dispose();
mCachMemory2?.Dispose();
mMergeMemory?.Dispose();
} }
/// <summary> /// <summary>
......
...@@ -195,6 +195,8 @@ namespace Cdy.Tag ...@@ -195,6 +195,8 @@ namespace Cdy.Tag
LoggerService.Service.Info("LogManager", "记录"+ mNeedSaveMemory1.Name +"到日志文件 耗时" + sw.ElapsedMilliseconds + " "); LoggerService.Service.Info("LogManager", "记录"+ mNeedSaveMemory1.Name +"到日志文件 耗时" + sw.ElapsedMilliseconds + " ");
} }
closedEvent.Set(); closedEvent.Set();
LoggerService.Service.Info("LogManager", "退出!");
} }
/// <summary> /// <summary>
......
...@@ -56,7 +56,7 @@ namespace Cdy.Tag ...@@ -56,7 +56,7 @@ namespace Cdy.Tag
private DateTime mCurrentTime; private DateTime mCurrentTime;
private SeriseFileItem[] mSeriseFile; //private SeriseFileItem[] mSeriseFile;
private Dictionary<int, CompressMemory> mWaitForProcessMemory = new Dictionary<int, CompressMemory>(); private Dictionary<int, CompressMemory> mWaitForProcessMemory = new Dictionary<int, CompressMemory>();
...@@ -205,6 +205,7 @@ namespace Cdy.Tag ...@@ -205,6 +205,7 @@ namespace Cdy.Tag
/// </summary> /// </summary>
public void Start() public void Start()
{ {
mIsClosed = false;
Init(); Init();
resetEvent = new ManualResetEvent(false); resetEvent = new ManualResetEvent(false);
closedEvent = new ManualResetEvent(false); closedEvent = new ManualResetEvent(false);
...@@ -218,14 +219,17 @@ namespace Cdy.Tag ...@@ -218,14 +219,17 @@ namespace Cdy.Tag
/// </summary> /// </summary>
public void Stop() public void Stop()
{ {
mIsClosed = false; mIsClosed = true;
resetEvent.Set(); resetEvent.Set();
closedEvent.WaitOne(); 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(); resetEvent.Dispose();
closedEvent.Dispose(); closedEvent.Dispose();
......
...@@ -11,6 +11,7 @@ using System.Collections.Generic; ...@@ -11,6 +11,7 @@ using System.Collections.Generic;
using System.Text; using System.Text;
using System.Threading; using System.Threading;
using System.Linq; using System.Linq;
using System.Diagnostics;
namespace Cdy.Tag namespace Cdy.Tag
{ {
...@@ -33,7 +34,7 @@ namespace Cdy.Tag ...@@ -33,7 +34,7 @@ namespace Cdy.Tag
/// </summary> /// </summary>
private Dictionary<long, long> mCount = new Dictionary<long, long>(); private Dictionary<long, long> mCount = new Dictionary<long, long>();
public const int MaxTagCount = 100000; public const int MaxTagCount = 50000;
private int mCurrentCount = 0; private int mCurrentCount = 0;
...@@ -99,7 +100,8 @@ namespace Cdy.Tag ...@@ -99,7 +100,8 @@ namespace Cdy.Tag
if (mIsBusy) if (mIsBusy)
{ {
mBusyCount++; mBusyCount++;
if(Id==0) //if(Id==0)
if(mBusyCount>4)
LoggerService.Service.Warn("Record", "TimerMemoryCacheProcesser"+Id+" 出现阻塞:"+mBusyCount); LoggerService.Service.Warn("Record", "TimerMemoryCacheProcesser"+Id+" 出现阻塞:"+mBusyCount);
} }
else else
...@@ -127,7 +129,7 @@ namespace Cdy.Tag ...@@ -127,7 +129,7 @@ namespace Cdy.Tag
{ {
mIsClosed = true; mIsClosed = true;
resetEvent.Set(); resetEvent.Set();
closedEvent.WaitOne(1000); closedEvent.WaitOne();
} }
/// <summary> /// <summary>
...@@ -167,7 +169,7 @@ namespace Cdy.Tag ...@@ -167,7 +169,7 @@ namespace Cdy.Tag
mCount.Clear(); mCount.Clear();
mCurrentCount = 0; mCurrentCount = 0;
} }
/// <summary> /// <summary>
/// ///
...@@ -184,6 +186,7 @@ namespace Cdy.Tag ...@@ -184,6 +186,7 @@ namespace Cdy.Tag
try try
{ {
mIsBusy = true; mIsBusy = true;
foreach (var vv in vkeys) foreach (var vv in vkeys)
{ {
mCount[vv] += HisEnginer.MemoryTimeTick; mCount[vv] += HisEnginer.MemoryTimeTick;
...@@ -193,6 +196,7 @@ namespace Cdy.Tag ...@@ -193,6 +196,7 @@ namespace Cdy.Tag
ProcessTags(mTimerTags[vv]); ProcessTags(mTimerTags[vv]);
} }
} }
mIsBusy = false; mIsBusy = false;
} }
catch catch
...@@ -202,6 +206,8 @@ namespace Cdy.Tag ...@@ -202,6 +206,8 @@ namespace Cdy.Tag
resetEvent.Reset(); resetEvent.Reset();
} }
closedEvent.Set(); closedEvent.Set();
LoggerService.Service.Info("TimerMemoryCacheProcesser", Id + " 退出");
} }
...@@ -211,11 +217,24 @@ namespace Cdy.Tag ...@@ -211,11 +217,24 @@ namespace Cdy.Tag
/// <param name="tags"></param> /// <param name="tags"></param>
private void ProcessTags(List<HisRunTag> tags) private void ProcessTags(List<HisRunTag> tags)
{ {
//Stopwatch sw = new Stopwatch();
//sw.Start();
int tim = (int)((mLastUpdateTime - HisRunTag.StartTime).TotalMilliseconds / HisEnginer.MemoryTimeTick); int tim = (int)((mLastUpdateTime - HisRunTag.StartTime).TotalMilliseconds / HisEnginer.MemoryTimeTick);
//System.Threading.Tasks.Parallel.ForEach(tags, (vv) =>
//{
// vv.UpdateValue(tim);
//});
foreach (var vv in tags) foreach (var vv in tags)
{ {
vv.UpdateValue(tim); vv.UpdateValue(tim);
} }
//{
//sw.Stop();
// LoggerService.Service.Info("ProcessTags", "TimerMemoryCacheProcesser" + Id + " 处理变量:" +tags.Count+" " + sw.ElapsedMilliseconds);
//}
} }
/// <summary> /// <summary>
......
...@@ -129,7 +129,7 @@ namespace Cdy.Tag ...@@ -129,7 +129,7 @@ namespace Cdy.Tag
{ {
mIsClosed = true; mIsClosed = true;
resetEvent.Set(); resetEvent.Set();
closedEvent.WaitOne(1000); closedEvent.WaitOne();
} }
/// <summary> /// <summary>
...@@ -261,6 +261,7 @@ namespace Cdy.Tag ...@@ -261,6 +261,7 @@ namespace Cdy.Tag
resetEvent.Reset(); resetEvent.Reset();
} }
closedEvent.Set(); closedEvent.Set();
LoggerService.Service.Info("ValueChangedMemoryCacheProcesser", Name + " 退出");
} }
/// <summary> /// <summary>
......
...@@ -27,6 +27,8 @@ namespace SimDriver ...@@ -27,6 +27,8 @@ namespace SimDriver
private DateTime mLastProcessTime = DateTime.Now; private DateTime mLastProcessTime = DateTime.Now;
private int mBusyCount = 0;
#endregion ...Variables... #endregion ...Variables...
#region ... Events ... #region ... Events ...
...@@ -113,29 +115,49 @@ namespace SimDriver ...@@ -113,29 +115,49 @@ namespace SimDriver
if (mIsBusy) if (mIsBusy)
{ {
mBusyCount++;
if(mBusyCount>=10)
LoggerService.Service.Warn("Sim Driver", "出现阻塞"); LoggerService.Service.Warn("Sim Driver", "出现阻塞");
return; return;
} }
mBusyCount = 0;
mIsBusy = true; mIsBusy = true;
DateTime time = DateTime.Now; DateTime time = DateTime.Now;
if ((time - mLastProcessTime).Seconds < 1) if ((time - mLastProcessTime).Seconds < 1)
{ {
mIsBusy = false;
return; return;
} }
mLastProcessTime = time; mLastProcessTime = time;
mNumber++; mNumber++;
mNumber = mNumber > (short)360 ? (short)0 : mNumber; mNumber = mNumber > (short)360 ? (short)0 : mNumber;
//#if DEBUG //#if DEBUG
// Stopwatch sw = new Stopwatch(); // Stopwatch sw = new Stopwatch();
// sw.Start(); // sw.Start();
//#endif //#endif
double fval = Math.Cos(mNumber / 180.0 * Math.PI); double fval = Math.Cos(mNumber / 180.0 * Math.PI);
double sval = Math.Sin(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") if (vv.Key == "Sim:cos")
{ {
...@@ -149,28 +171,13 @@ namespace SimDriver ...@@ -149,28 +171,13 @@ namespace SimDriver
{ {
mTagService.SetTagValue(vv.Value, mNumber); 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 //#if DEBUG
// sw.Stop(); // 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)); // 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 //#endif
mIsBusy = false; mIsBusy = false;
} }
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册