// 线程管理中心,负责线程的管理,如线程的初始化,启动,停止,包括识别线程的算法加载
using MvCameraControl;
using MvvmScaffoldFrame48.DLL.CameraTools;
using MvvmScaffoldFrame48.DLL.ConfigTools;
using MvvmScaffoldFrame48.Model.ResultModel;
using MvvmScaffoldFrame48.Model.StorageModel.ImageAlgorithm.ShuLI;
using MvvmScaffoldFrame48.Model.StorageModel.Configs;
using System;
using System.Collections.Concurrent;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Media.Media3D;
namespace MvvmScaffoldFrame48.DLL.ThreadManager
{
public class ThreadManager
{
#region 变量与实例
public static ThreadManager Instance => _instance;
//相机组
private readonly CameraGroup[] _cameraGroups = new CameraGroup[1];
// 通信线程
private readonly CommunicationThread _communicationThread;
private static ThreadManager _instance = new ThreadManager();
private ConfigService configService = ConfigService.Instance;
#endregion
#region 构造函数
///
/// 构造函数
///
private ThreadManager()
{
// 加载相机配置
configService.LoadAsync();
configService.SaveAsync();
// 获取相机列表
HikVision.GetCameraList(out List cameraInfoList);
// 初始化四个相机组
for (int i = 0; i < _cameraGroups.Count(); i++)
{
// 加载对应相机位的配置参数
var CheckConfig = configService.CamerasProcessConfig.Where(c => c.CameraId == i);
if(CheckConfig.Count() == 0)
{
_cameraGroups[i] = null;
continue;
}
var cameraConfig = CheckConfig.FirstOrDefault();
// 获取参数对应的相机
HikVision.GetCamera(out IDeviceInfo cameraInfo, cameraConfig.CameraSN);
if (cameraInfo == null)
{
_cameraGroups[i] = new CameraGroup
{
CameraId = i,
ImageQueue = new ConcurrentQueue(),
QueueSemaphore = new SemaphoreSlim(0),
Camera = new HikCamera(),
Configuration = cameraConfig
};
}
else
{
_cameraGroups[i] = new CameraGroup
{
CameraId = i,
ImageQueue = new ConcurrentQueue(),
QueueSemaphore = new SemaphoreSlim(0),
Camera = new HikCamera(cameraInfo),
Configuration = cameraConfig
};
}
// 订阅处理结果事件
_cameraGroups[i].ProcessResultAvailable += OnProcessResultAvailable;
}
// 初始化通信和显示线程
_communicationThread = new CommunicationThread();
}
#endregion
#region 公共方法
///
/// 动态更改相机算法
///
public void ChangeCameraAlgorithm(int cameraId, string algorithmName)
{
if (cameraId >= 0 && cameraId < _cameraGroups.Count())
{
// 相机组未初始化
if (_cameraGroups == null)
{
Console.WriteLine($"相机组{cameraId}未初始化");
return;
}
// 更新配置
var config = configService.CamerasProcessConfig.FirstOrDefault(c => c.CameraId == cameraId);
if (config != null)
{
config.ProcessingAlgorithmName = algorithmName;
}
// 如果相机正在运行,需要重启以应用新算法
bool wasRunning = _cameraGroups[cameraId].IsRunning;
if (wasRunning)
{
_cameraGroups[cameraId].Stop();
Thread.Sleep(100); // 等待线程完全停止
}
// 更新相机组配置并重新启动
_cameraGroups[cameraId].Configuration = config;
if (wasRunning)
{
_cameraGroups[cameraId].Start();
}
}
}
///
/// 启动指定相机组
///
public void StartCameraGroup(int cameraId)
{
if (cameraId >= 0 && cameraId < _cameraGroups.Count())
{
_cameraGroups[cameraId].Start();
}
}
///
/// 停止指定相机组
///
public void StopCameraGroup(int cameraId)
{
if (cameraId >= 0 && cameraId < _cameraGroups.Count())
{
_cameraGroups[cameraId].Stop();
}
}
///
/// 启动通信线程
///
public void StartCommunication()
{
_communicationThread.Start();
}
///
/// 停止通信线程
///
public void StopCommunication()
{
_communicationThread.Stop();
}
///
/// 启动所有线程
///
public void StartAll()
{
for (int i = 0; i < 4; i++)
{
StartCameraGroup(i);
}
StartCommunication();
}
///
/// 停止所有线程
///
public void StopAll()
{
for (int i = 0; i < 4; i++)
{
StopCameraGroup(i);
}
StopCommunication();
}
///
/// 获取相机组运行状态
///
public bool IsCameraGroupRunning(int cameraId)
{
return cameraId >= 0 && cameraId < _cameraGroups.Count() && _cameraGroups[cameraId].IsRunning;
}
///
/// 动态更新相机算法参数
///
public void UpdateCameraParameters(int cameraId, object newParameters)
{
if (cameraId >= 0 && cameraId < _cameraGroups.Count())
{
_cameraGroups[cameraId].UpdateAlgorithmParameters(newParameters);
}
}
///
/// 获取通信线程运行状态
///
public bool IsCommunicationRunning => _communicationThread.IsRunning;
#endregion
#region 私有方法
///
/// 处理相机处理结果
///
private void OnProcessResultAvailable(object sender, CameraProcessEventArgsResultModel e)
{
// 将处理结果发送到通信线程
_communicationThread.SendData(e);
// 可以在这里添加其他处理逻辑,如更新显示等
//Console.WriteLine($"收到相机{e.CameraId}的处理结果");
}
#endregion
}
}