ThreadManager.cs 8.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267
  1. // 线程管理中心,负责线程的管理,如线程的初始化,启动,停止,包括识别线程的算法加载
  2. using MvCameraControl;
  3. using MvvmScaffoldFrame48.DLL.CameraTools;
  4. using MvvmScaffoldFrame48.DLL.ConfigTools;
  5. using MvvmScaffoldFrame48.Model.ResultModel;
  6. using MvvmScaffoldFrame48.Model.StorageModel.SystemConfig;
  7. using System;
  8. using System.Collections.Concurrent;
  9. using System.Collections.Generic;
  10. using System.Linq;
  11. using System.Threading;
  12. using System.Threading.Tasks;
  13. using System.Windows.Media.Media3D;
  14. namespace MvvmScaffoldFrame48.DLL.ThreadManager
  15. {
  16. public class ThreadManager
  17. {
  18. #region 变量与实例
  19. //相机组
  20. private readonly CameraGroup[] _cameraGroups = new CameraGroup[1];
  21. // 通信线程
  22. private readonly CommunicationThread _communicationThread;
  23. // 相机配置参数
  24. private List<CameraProcessConfigModel> _cameraConfigurations;
  25. #endregion
  26. #region 构造函数
  27. /// <summary>
  28. /// 构造函数
  29. /// </summary>
  30. public ThreadManager()
  31. {
  32. // 加载相机配置
  33. LoadCameraConfigurations();
  34. // 获取相机列表
  35. HikVision.GetCameraList(out List<IDeviceInfo> cameraInfoList);
  36. // 初始化四个相机组
  37. for (int i = 0; i < _cameraGroups.Count(); i++)
  38. {
  39. // 加载对应相机位的配置参数
  40. var CheckConfig = _cameraConfigurations.Where(c => c.CameraId == i);
  41. if(CheckConfig.Count() == 0)
  42. {
  43. _cameraGroups[i] = null;
  44. continue;
  45. }
  46. var cameraConfig = CheckConfig.FirstOrDefault();
  47. // 获取参数对应的相机
  48. HikVision.GetCamera(out IDeviceInfo cameraInfo, cameraConfig.CameraSN);
  49. if (cameraInfo == null)
  50. {
  51. _cameraGroups[i] = new CameraGroup
  52. {
  53. CameraId = i,
  54. ImageQueue = new ConcurrentQueue<IImage>(),
  55. QueueSemaphore = new SemaphoreSlim(0),
  56. Camera = new HikCamera(),
  57. Configuration = cameraConfig
  58. };
  59. }
  60. else
  61. {
  62. _cameraGroups[i] = new CameraGroup
  63. {
  64. CameraId = i,
  65. ImageQueue = new ConcurrentQueue<IImage>(),
  66. QueueSemaphore = new SemaphoreSlim(0),
  67. Camera = new HikCamera(cameraInfo),
  68. Configuration = cameraConfig
  69. };
  70. }
  71. // 订阅处理结果事件
  72. _cameraGroups[i].ProcessResultAvailable += OnProcessResultAvailable;
  73. }
  74. // 初始化通信和显示线程
  75. _communicationThread = new CommunicationThread();
  76. }
  77. #endregion
  78. #region 公共方法
  79. /// <summary>
  80. /// 动态更改相机算法
  81. /// </summary>
  82. public void ChangeCameraAlgorithm(int cameraId, string algorithmName)
  83. {
  84. if (cameraId >= 0 && cameraId < _cameraGroups.Count())
  85. {
  86. // 相机组未初始化
  87. if (_cameraGroups == null)
  88. {
  89. Console.WriteLine($"相机组{cameraId}未初始化");
  90. return;
  91. }
  92. // 更新配置
  93. var config = _cameraConfigurations.FirstOrDefault(c => c.CameraId == cameraId);
  94. if (config != null)
  95. {
  96. config.ProcessingAlgorithmName = algorithmName;
  97. }
  98. // 如果相机正在运行,需要重启以应用新算法
  99. bool wasRunning = _cameraGroups[cameraId].IsRunning;
  100. if (wasRunning)
  101. {
  102. _cameraGroups[cameraId].Stop();
  103. Thread.Sleep(100); // 等待线程完全停止
  104. }
  105. // 更新相机组配置并重新启动
  106. _cameraGroups[cameraId].Configuration = config;
  107. if (wasRunning)
  108. {
  109. _cameraGroups[cameraId].Start();
  110. }
  111. }
  112. }
  113. /// <summary>
  114. /// 启动指定相机组
  115. /// </summary>
  116. public void StartCameraGroup(int cameraId)
  117. {
  118. if (cameraId >= 0 && cameraId < _cameraGroups.Count())
  119. {
  120. _cameraGroups[cameraId].Start();
  121. }
  122. }
  123. /// <summary>
  124. /// 停止指定相机组
  125. /// </summary>
  126. public void StopCameraGroup(int cameraId)
  127. {
  128. if (cameraId >= 0 && cameraId < 4)
  129. {
  130. _cameraGroups[cameraId].Stop();
  131. }
  132. }
  133. /// <summary>
  134. /// 启动通信线程
  135. /// </summary>
  136. public void StartCommunication()
  137. {
  138. _communicationThread.Start();
  139. }
  140. /// <summary>
  141. /// 停止通信线程
  142. /// </summary>
  143. public void StopCommunication()
  144. {
  145. _communicationThread.Stop();
  146. }
  147. /// <summary>
  148. /// 启动所有线程
  149. /// </summary>
  150. public void StartAll()
  151. {
  152. for (int i = 0; i < 4; i++)
  153. {
  154. StartCameraGroup(i);
  155. }
  156. StartCommunication();
  157. }
  158. /// <summary>
  159. /// 停止所有线程
  160. /// </summary>
  161. public void StopAll()
  162. {
  163. for (int i = 0; i < 4; i++)
  164. {
  165. StopCameraGroup(i);
  166. }
  167. StopCommunication();
  168. }
  169. /// <summary>
  170. /// 获取相机组运行状态
  171. /// </summary>
  172. public bool IsCameraGroupRunning(int cameraId)
  173. {
  174. return cameraId >= 0 && cameraId < _cameraGroups.Count() && _cameraGroups[cameraId].IsRunning;
  175. }
  176. /// <summary>
  177. /// 为每个相机创建配置
  178. /// </summary>
  179. private CameraProcessConfigModel CreateCameraConfiguration(int cameraId,string ProcessingAlgorithm)
  180. {
  181. var config = new CameraProcessConfigModel
  182. {
  183. CameraId = cameraId,
  184. CameraSN = "00E31768761",
  185. IsEnabled = true
  186. };
  187. switch (ProcessingAlgorithm)
  188. {
  189. case "ProcessingAlgorithm":
  190. config.ProcessingAlgorithmName = "ProcessingAlgorithm";
  191. config.AlgorithmParameters = new Dictionary<string, object>
  192. {
  193. { "Threshold", 150.0 },
  194. { "MinArea", 200 },
  195. { "EnableFiltering", true }
  196. };
  197. break;
  198. }
  199. return config;
  200. }
  201. /// <summary>
  202. /// 动态更新相机算法参数
  203. /// </summary>
  204. public void UpdateCameraParameters(int cameraId, Dictionary<string, object> newParameters)
  205. {
  206. if (cameraId >= 0 && cameraId < _cameraGroups.Count())
  207. {
  208. _cameraGroups[cameraId].UpdateAlgorithmParameters(newParameters);
  209. }
  210. }
  211. /// <summary>
  212. /// 获取通信线程运行状态
  213. /// </summary>
  214. public bool IsCommunicationRunning => _communicationThread.IsRunning;
  215. #endregion
  216. #region 私有方法
  217. /// <summary>
  218. /// 加载相机配置
  219. /// </summary>
  220. private void LoadCameraConfigurations()
  221. {
  222. // 这里可以从XML文件、数据库或其他配置源加载配置
  223. _cameraConfigurations = new List<CameraProcessConfigModel>()
  224. {
  225. CreateCameraConfiguration(0, "ProcessingAlgorithm"),
  226. };
  227. XMLReadWrite.SerializeToXml(_cameraConfigurations, "TestConfig.xml");
  228. }
  229. /// <summary>
  230. /// 处理相机处理结果
  231. /// </summary>
  232. private void OnProcessResultAvailable(object sender, CameraProcessEventArgsResultModel e)
  233. {
  234. // 将处理结果发送到通信线程
  235. _communicationThread.SendData(e);
  236. // 可以在这里添加其他处理逻辑,如更新显示等
  237. Console.WriteLine($"收到相机{e.CameraId}的处理结果");
  238. }
  239. #endregion
  240. }
  241. }