ThreadManager.cs 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128
  1. using MvCameraControl;
  2. using MvvmScaffoldFrame48.DLL.CameraTools;
  3. using MvvmScaffoldFrame48.Model.ResultModel;
  4. using System;
  5. using System.Collections.Concurrent;
  6. using System.Collections.Generic;
  7. using System.Linq;
  8. using System.Threading;
  9. using System.Threading.Tasks;
  10. namespace MvvmScaffoldFrame48.DLL.ThreadManager
  11. {
  12. public class ThreadManager
  13. {
  14. private readonly CameraGroup[] _cameraGroups = new CameraGroup[1];
  15. private readonly CommunicationThread _communicationThread;
  16. public ThreadManager()
  17. {
  18. HikVision.GetCameraList(out List<IDeviceInfo> cameraInfoList);
  19. // 初始化四个相机组
  20. for (int i = 0; i < _cameraGroups.Count(); i++)
  21. {
  22. _cameraGroups[i] = new CameraGroup
  23. {
  24. CameraId = i,
  25. ImageQueue = new ConcurrentQueue<IImage>(),
  26. QueueSemaphore = new SemaphoreSlim(0),
  27. Camera = new HikCamera(cameraInfoList[i])
  28. };
  29. _cameraGroups[i].ImageProcessor = new ProcessingAlgorithm();
  30. // 订阅处理结果事件
  31. _cameraGroups[i].ProcessResultAvailable += OnProcessResultAvailable;
  32. }
  33. // 初始化通信和显示线程
  34. _communicationThread = new CommunicationThread();
  35. }
  36. /// <summary>
  37. /// 处理相机处理结果
  38. /// </summary>
  39. private void OnProcessResultAvailable(object sender, CameraProcessEventArgsResultModel e)
  40. {
  41. // 将处理结果发送到通信线程
  42. _communicationThread.SendData(e);
  43. // 可以在这里添加其他处理逻辑,如更新显示等
  44. Console.WriteLine($"收到相机{e.CameraId}的处理结果");
  45. }
  46. /// <summary>
  47. /// 启动指定相机组
  48. /// </summary>
  49. public void StartCameraGroup(int cameraId)
  50. {
  51. if (cameraId >= 0 && cameraId < _cameraGroups.Count())
  52. {
  53. _cameraGroups[cameraId].Start();
  54. }
  55. }
  56. /// <summary>
  57. /// 停止指定相机组
  58. /// </summary>
  59. public void StopCameraGroup(int cameraId)
  60. {
  61. if (cameraId >= 0 && cameraId < 4)
  62. {
  63. _cameraGroups[cameraId].Stop();
  64. }
  65. }
  66. /// <summary>
  67. /// 启动通信线程
  68. /// </summary>
  69. public void StartCommunication()
  70. {
  71. _communicationThread.Start();
  72. }
  73. /// <summary>
  74. /// 停止通信线程
  75. /// </summary>
  76. public void StopCommunication()
  77. {
  78. _communicationThread.Stop();
  79. }
  80. /// <summary>
  81. /// 启动所有线程
  82. /// </summary>
  83. public void StartAll()
  84. {
  85. for (int i = 0; i < 4; i++)
  86. {
  87. StartCameraGroup(i);
  88. }
  89. StartCommunication();
  90. }
  91. /// <summary>
  92. /// 停止所有线程
  93. /// </summary>
  94. public void StopAll()
  95. {
  96. for (int i = 0; i < 4; i++)
  97. {
  98. StopCameraGroup(i);
  99. }
  100. StopCommunication();
  101. }
  102. /// <summary>
  103. /// 获取相机组运行状态
  104. /// </summary>
  105. public bool IsCameraGroupRunning(int cameraId)
  106. {
  107. return cameraId >= 0 && cameraId < 4 && _cameraGroups[cameraId].IsRunning;
  108. }
  109. /// <summary>
  110. /// 获取通信线程运行状态
  111. /// </summary>
  112. public bool IsCommunicationRunning => _communicationThread.IsRunning;
  113. }
  114. }