using Check.Main.Camera; using Check.Main.Common; using System; using System.Collections.Concurrent; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace Check.Main.Infer { public static class DetectionCoordinator { /// /// 定义存储所有相机处理器的字典 /// 键是相机的唯一编号 (CameraIndex),值是对应的处理器实例。 /// private static ConcurrentDictionary _processors = new ConcurrentDictionary(); /// /// 用于在产品组装时进行同步,确保线程安全 /// private static ConcurrentDictionary _productAssemblies = new ConcurrentDictionary(); /// /// 可用的相机数量 /// private static int _enabledCameraCount = 0; public static event EventHandler OnDetectionCompleted; public static bool IsDetectionRunning { get; private set; } = false; // OnDetectionCompleted 事件现在也属于这里 //public static event EventHandler OnDetectionCompleted; public static void StartDetection() { if (!IsDetectionRunning) { IsDetectionRunning = true; ThreadSafeLogger.Log("检测统计已启动。"); } } public static void StopDetection() { if (IsDetectionRunning) { IsDetectionRunning = false; ThreadSafeLogger.Log("检测统计已停止。"); } } public static void Initialize(List cameraSettings, List modelSettings) { Shutdown(); // 先关闭旧的 var enabledCameras = cameraSettings.Where(c => c.IsEnabled).ToList(); _enabledCameraCount = enabledCameras.Count; if (_enabledCameraCount == 0) return; foreach (var camSetting in enabledCameras) { // 找到与相机编号匹配的模型 var model = modelSettings.FirstOrDefault(m => m.Id == camSetting.ModelID); if (model == null) { ThreadSafeLogger.Log($"[警告] 找不到与相机 #{camSetting.CameraIndex} 匹配的模型,该相机将无法处理图像。"); continue; } var processor = new CameraProcessor(camSetting.CameraIndex,camSetting.ModelID); _processors.TryAdd(camSetting.CameraIndex, processor); processor.Start(); } ThreadSafeLogger.Log($"检测协调器已初始化,启动了 {_processors.Count} 个相机处理线程。"); } public static void EnqueueImage(int cameraIndex, Bitmap bmp) { if (_processors.TryGetValue(cameraIndex, out var processor)) { processor.EnqueueImage(bmp); } else { // 如果找不到处理器,必须释放Bitmap防止泄漏 bmp?.Dispose(); } } // 供 CameraProcessor 回调,用以组装产品 public static void AssembleProduct(ImageData data, string result) { var assembly = _productAssemblies.GetOrAdd(data.ProductId, (id) => new ProductAssembly(id, _enabledCameraCount)); if (assembly.AddResult(data.CameraIndex, result)) { string finalResult = assembly.GetFinalResult(); ThreadSafeLogger.Log($"产品 #{assembly.ProductId} 已检测完毕,最终结果: {finalResult}"); // 只有在检测运行时,才触发事件 if (IsDetectionRunning) { OnDetectionCompleted?.Invoke(null, new DetectionResultEventArgs(finalResult == "OK")); } if (_productAssemblies.TryRemove(assembly.ProductId, out var finishedAssembly)) { finishedAssembly.Dispose(); } } } /// /// 命令所有活动的相机处理器重置它们的内部计数器。 /// public static void ResetAllCounters() { foreach (var processor in _processors.Values) { processor.ResetCounter(); } ThreadSafeLogger.Log("所有相机处理器的产品计数器已重置。"); } public static CameraProcessor GetProcessor(int cameraIndex) { _processors.TryGetValue(cameraIndex, out var p); return p; } public static IEnumerable GetAllProcessors() { return _processors.Values; } public static void Shutdown() { foreach (var processor in _processors.Values) { processor.Dispose(); } _processors.Clear(); foreach (var assembly in _productAssemblies.Values) { assembly.Dispose(); } _productAssemblies.Clear(); ThreadSafeLogger.Log("检测协调器已关闭。"); } } }