From de8375471eb9b4b7b00f003e940207be8e3cdb79 Mon Sep 17 00:00:00 2001 From: fajiao <1519100073@qq.com> Date: Tue, 18 Oct 2022 11:40:35 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E9=83=A8=E5=88=86=E8=AE=A1=E7=AE=97?= =?UTF-8?q?=E5=8F=98=E9=87=8F=E5=86=99=E5=8A=A0=E9=94=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Cis.Application/Core/Algo/MarkSearcherBase.cs | 37 ++++- .../Core/Center/CameraDataCenter.cs | 140 +++++++++++++----- Cis.Core/Extension/ObjectExtension.cs | 2 +- 3 files changed, 135 insertions(+), 44 deletions(-) diff --git a/Cis.Application/Core/Algo/MarkSearcherBase.cs b/Cis.Application/Core/Algo/MarkSearcherBase.cs index 7e44e07..153b722 100644 --- a/Cis.Application/Core/Algo/MarkSearcherBase.cs +++ b/Cis.Application/Core/Algo/MarkSearcherBase.cs @@ -1,4 +1,5 @@ using MathNet.Numerics.LinearAlgebra; +using System.Collections.Concurrent; using System.Drawing; namespace Cis.Application.Core; @@ -12,7 +13,15 @@ public abstract class MarkSearcherBase /// protected CameraCalcInfo _cameraCalcInfo { get; set; } - protected List _markLabelInfoList { get; set; } = new(); + /// + /// _markLabelInfoList 锁对象,写锁 + /// + private static readonly object mliListLock = new(); + + /// + /// 需要计算的 markLabelInfo 列表 + /// + protected ConcurrentDictionary _markLabelInfoDict { get; set; } = new(); protected MatrixBuilder MBuilder { get; set; } = Matrix.Build; @@ -38,10 +47,10 @@ public abstract class MarkSearcherBase { List resultList = new(); - if (World2CameraMatrix == null || _markLabelInfoList.Count == 0) + if (World2CameraMatrix == null || _markLabelInfoDict.IsEmpty) return resultList; - foreach (MarkLabelCalcInfo item in _markLabelInfoList) + foreach (MarkLabelCalcInfo item in _markLabelInfoDict.Values) { Matrix labelC2WMatrix = ConvertCameraToWorld(item); Matrix labelPointMatrix = MBuilder.DenseOfArray(new double[,] @@ -213,18 +222,30 @@ public abstract class MarkSearcherBase } } - public void AddMarkLabelCalcInfo(MarkLabelCalcInfo markLabelCalcInfo) + public bool AddMarkLabelCalcInfo(MarkLabelCalcInfo info) { - _markLabelInfoList.Add(markLabelCalcInfo); + lock (mliListLock) + { + if (_markLabelInfoDict.ContainsKey(info.Id)) + return false; + return _markLabelInfoDict.TryAdd(info.Id, info); + } } - public bool ExistsMarkLabelCalcInfo(object id) + public bool DeleteMarkLabelCalcInfo(long id) { - foreach (MarkLabelCalcInfo info in _markLabelInfoList) + lock (mliListLock) { - if (info.Id.Equals(id)) + if (!_markLabelInfoDict.ContainsKey(id)) return true; + return _markLabelInfoDict.Remove(id); } + } + + public bool ExistsMarkLabelCalcInfo(long id) + { + if (_markLabelInfoDict.ContainsKey(id)) + return true; return false; } diff --git a/Cis.Application/Core/Center/CameraDataCenter.cs b/Cis.Application/Core/Center/CameraDataCenter.cs index ea766c7..0f47010 100644 --- a/Cis.Application/Core/Center/CameraDataCenter.cs +++ b/Cis.Application/Core/Center/CameraDataCenter.cs @@ -17,11 +17,6 @@ public class CameraDataCenter private Thread _thread { get; set; } - /// - /// (cbCameraId, MarkSearcherBase) - /// - private ConcurrentDictionary _markSearcherDict { get; set; } = new(); - /// /// (cbCameraId, cbCameraIp) /// @@ -37,6 +32,22 @@ public class CameraDataCenter /// private ConcurrentDictionary _cameraPtzInfoDict { get; set; } = new(); + /// + /// _markSearcherDict 锁对象,写锁 + /// + private static readonly ReaderWriterLockSlim msDictLock = new(); + + /// + /// (cbCameraId, MarkSearcherBase) + /// + private ConcurrentDictionary _markSearcherDict { get; set; } = new(); + + /// + /// (cameraId, List(MarkLabelCalcResult)) + /// + + private ConcurrentDictionary> _markLabelCalcResultListDict { get; set; } = new(); + #endregion Attr public CameraDataCenter() @@ -105,6 +116,7 @@ public class CameraDataCenter if (ptzInfo == null) continue; markSearcher.UpdateCameraCalcInfo(ptzInfo); List resultList = markSearcher.Calc(); + _markLabelCalcResultListDict[cameraId] = resultList; } } @@ -119,37 +131,55 @@ public class CameraDataCenter /// public bool ActiveCamera(long cameraId) { - CbCamera cbCamera = _cbCameraRep.GetById(cameraId); - if (cbCamera == null) return false; - TbPtzCamera tbPtzCamera; - string cameraIp = cbCamera.Ip; - if (!_tbPtzCameraDict.IsExistKey(cameraIp)) - { - tbPtzCamera = _tbPtzCameraRep.GetFirst(u => u.Ip == cameraIp); - if (tbPtzCamera == null) return false; - _tbPtzCameraDict[cameraIp] = tbPtzCamera; - } - else + try { - tbPtzCamera = _tbPtzCameraDict[cameraIp]; + msDictLock.EnterWriteLock(); + if (_markSearcherDict.ExistsKey(cameraId)) + return false; + // 获取 cbCamera + CbCamera cbCamera = _cbCameraRep.GetById(cameraId); + if (cbCamera == null) return false; + // 获取 tbPtzCamera + TbPtzCamera tbPtzCamera; + string cameraIp = cbCamera.Ip; + if (!_tbPtzCameraDict.ExistsKey(cameraIp)) + { + tbPtzCamera = _tbPtzCameraRep.GetFirst(u => u.Ip == cameraIp); + if (tbPtzCamera == null) return false; + _tbPtzCameraDict[cameraIp] = tbPtzCamera; + } + else + { + tbPtzCamera = _tbPtzCameraDict[cameraIp]; + } + // 存储 cbCamera id 对应 ip 关系 + _cbCameraId2IpDict[cbCamera.Id] = cameraIp; + // 创建 cameraCalcInfo + CameraCalcInfo cameraCalcInfo = CameraCalcInfo.New(cameraId, _ptzServerApi.GetPtzInfo(tbPtzCamera.Id)); + // 创建 markSeacher + HikMarkSeacher markSeacher = new(cameraCalcInfo); + // 获取 cmMarkLabel 列表 + List cmMarkLabelList = _cmMarkLableRep.GetList(u => u.CbCameraId == cameraId); + // 将 cmMarkLabel 一一添加到 markSeacher + foreach (CmMarkLabel item in cmMarkLabelList) + { + MarkLabelCalcInfo markLabelCalcInfo = MarkLabelCalcInfo.New( + item.Id, + PtzInfo.New(item.PanPosition, item.TiltPosition, item.ZoomPosition), + item.CanvasWidth, + item.CanvasHeight, + item.CanvasLeft, + item.CanvasTop + ); + markSeacher.AddMarkLabelCalcInfo(markLabelCalcInfo); + } + // 将 markSeacher 放入字典 + _markSearcherDict[cameraId] = markSeacher; } - _cbCameraId2IpDict[cbCamera.Id] = cameraIp; - CameraCalcInfo cameraCalcInfo = CameraCalcInfo.New(cameraId, _ptzServerApi.GetPtzInfo(tbPtzCamera.Id)); - HikMarkSeacher markSeacher = new(cameraCalcInfo); - List cmMarkLabelList = _cmMarkLableRep.GetList(u => u.CbCameraId == cameraId); - foreach (CmMarkLabel item in cmMarkLabelList) + finally { - MarkLabelCalcInfo markLabelCalcInfo = MarkLabelCalcInfo.New( - item.Id, - PtzInfo.New(item.PanPosition, item.TiltPosition, item.ZoomPosition), - item.CanvasWidth, - item.CanvasHeight, - item.CanvasLeft, - item.CanvasTop - ); - markSeacher.AddMarkLabelCalcInfo(markLabelCalcInfo); + msDictLock.ExitWriteLock(); } - _markSearcherDict[cameraId] = markSeacher; return true; } @@ -160,12 +190,52 @@ public class CameraDataCenter /// public bool DeActiveCamera(long cameraId) { - return false; + try + { + msDictLock.EnterWriteLock(); + _markSearcherDict.Remove(cameraId); + _markLabelCalcResultListDict.Remove(cameraId); + } + finally + { + msDictLock.ExitWriteLock(); + } + return true; + } + + public bool AddCameraMarkLabel(long cameraId, long markLabelId) + { + if (!_markSearcherDict.ExistsKey(cameraId)) + return false; + MarkSearcherBase markSearcher = _markSearcherDict[cameraId]; + if (markSearcher.ExistsMarkLabelCalcInfo(markLabelId)) + return false; + CmMarkLabel label = _cmMarkLableRep.GetById(markLabelId); + if (label == null) + return false; + MarkLabelCalcInfo markLabelCalcInfo = MarkLabelCalcInfo.New( + label.Id, + PtzInfo.New(label.PanPosition, label.TiltPosition, label.ZoomPosition), + label.CanvasWidth, + label.CanvasHeight, + label.CanvasLeft, + label.CanvasTop + ); + return markSearcher.AddMarkLabelCalcInfo(markLabelCalcInfo); } - public bool UpdateCamera(long cameraId, long markLabelId) + public bool DeleteCameraMarkLabel(long cameraId, long marklabelId) { - return false; + if (!_markSearcherDict.ExistsKey(cameraId)) + return false; + MarkSearcherBase markSearcher = _markSearcherDict[cameraId]; + return markSearcher.DeleteMarkLabelCalcInfo(marklabelId); + } + + public List GetMarkLabelCalcResults(long cameraId) + { + + return null; } #endregion external call diff --git a/Cis.Core/Extension/ObjectExtension.cs b/Cis.Core/Extension/ObjectExtension.cs index 635ce49..4a85bb6 100644 --- a/Cis.Core/Extension/ObjectExtension.cs +++ b/Cis.Core/Extension/ObjectExtension.cs @@ -139,7 +139,7 @@ public static class ObjectExtension return sc != null; } - public static bool IsExistKey(this IDictionary dict, object key) + public static bool ExistsKey(this IDictionary dict, object key) { foreach (object item in dict.Keys) {