更新DeviceManager.cs文件
This commit is contained in:
@@ -198,6 +198,11 @@ namespace JoyD.Windows.CS.Toprie
|
|||||||
private string _deviceIp = "192.168.100.2";
|
private string _deviceIp = "192.168.100.2";
|
||||||
// 设备端口
|
// 设备端口
|
||||||
private int _devicePort = 8080;
|
private int _devicePort = 8080;
|
||||||
|
|
||||||
|
// 温度数据处理相关
|
||||||
|
private volatile byte[] _lastTemperatureFrame; // 存储最后一帧温度数据
|
||||||
|
private Thread _temperatureProcessingThread; // 温度数据处理线程
|
||||||
|
private volatile bool _shouldStopProcessing = false; // 控制处理线程停止的标志
|
||||||
// 设备连接状态
|
// 设备连接状态
|
||||||
private ConnectionStatus _connectionStatus = ConnectionStatus.Disconnected;
|
private ConnectionStatus _connectionStatus = ConnectionStatus.Disconnected;
|
||||||
// 是否已初始化
|
// 是否已初始化
|
||||||
@@ -206,6 +211,8 @@ namespace JoyD.Windows.CS.Toprie
|
|||||||
private readonly bool _isDisposed = false;
|
private readonly bool _isDisposed = false;
|
||||||
// 图像模式
|
// 图像模式
|
||||||
private ImageMode _currentImageMode = ImageMode.Infrared;
|
private ImageMode _currentImageMode = ImageMode.Infrared;
|
||||||
|
// 温度数据处理锁,用于防止并发处理温度数据
|
||||||
|
private object _temperatureProcessingLock = new object();
|
||||||
// 当前色彩模式
|
// 当前色彩模式
|
||||||
private PaletteType _currentPaletteType = PaletteType.WhiteHot;
|
private PaletteType _currentPaletteType = PaletteType.WhiteHot;
|
||||||
// 当前视频模式
|
// 当前视频模式
|
||||||
@@ -666,6 +673,9 @@ namespace JoyD.Windows.CS.Toprie
|
|||||||
_isInitialized = true;
|
_isInitialized = true;
|
||||||
Log($"[{DateTime.Now:HH:mm:ss.fff}] [线程:{Thread.CurrentThread.ManagedThreadId}] Initialize() - 初始化成功,_isInitialized设为true");
|
Log($"[{DateTime.Now:HH:mm:ss.fff}] [线程:{Thread.CurrentThread.ManagedThreadId}] Initialize() - 初始化成功,_isInitialized设为true");
|
||||||
|
|
||||||
|
// 启动温度数据处理线程
|
||||||
|
InitializeTemperatureProcessing();
|
||||||
|
|
||||||
// 更新状态为已连接
|
// 更新状态为已连接
|
||||||
UpdateConnectionStatus(ConnectionStatus.Connected, "SDK初始化成功");
|
UpdateConnectionStatus(ConnectionStatus.Connected, "SDK初始化成功");
|
||||||
|
|
||||||
@@ -702,6 +712,90 @@ namespace JoyD.Windows.CS.Toprie
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
/// <summary>
|
||||||
|
/// 启动温度数据清理定时器
|
||||||
|
/// </summary>
|
||||||
|
// 温度数据清理定时器相关方法已移除,改为直接在后台线程处理
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 停止温度数据清理定时器
|
||||||
|
/// </summary>
|
||||||
|
// 温度数据清理定时器相关方法已移除,改为直接在后台线程处理
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 清理温度数据
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="state">定时器状态对象</param>
|
||||||
|
/// <summary>
|
||||||
|
/// 在后台线程处理温度帧数据
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="frameData">温度帧数据</param>
|
||||||
|
/// <param name="width">宽度</param>
|
||||||
|
/// <param name="height">高度</param>
|
||||||
|
/// <summary>
|
||||||
|
/// 初始化温度数据处理线程
|
||||||
|
/// </summary>
|
||||||
|
private void InitializeTemperatureProcessing()
|
||||||
|
{
|
||||||
|
_shouldStopProcessing = false;
|
||||||
|
_temperatureProcessingThread = new Thread(ProcessLastTemperatureFrame);
|
||||||
|
_temperatureProcessingThread.IsBackground = true;
|
||||||
|
_temperatureProcessingThread.Name = "TemperatureProcessingThread";
|
||||||
|
_temperatureProcessingThread.Start();
|
||||||
|
Log("温度数据处理线程已启动");
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 处理线程方法 - 专门处理最后一帧温度数据
|
||||||
|
/// </summary>
|
||||||
|
private void ProcessLastTemperatureFrame()
|
||||||
|
{
|
||||||
|
while (!_shouldStopProcessing)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
// 使用Interlocked.Exchange原子操作获取并清空最后一帧数据
|
||||||
|
byte[] frameToProcess = Interlocked.Exchange(ref _lastTemperatureFrame, null);
|
||||||
|
|
||||||
|
// 如果有数据需要处理
|
||||||
|
if (frameToProcess != null && !_isTemperatureReceivingPaused)
|
||||||
|
{
|
||||||
|
// 记录处理开始时间
|
||||||
|
System.Diagnostics.Stopwatch stopwatch = new System.Diagnostics.Stopwatch();
|
||||||
|
stopwatch.Start();
|
||||||
|
|
||||||
|
// 调用温度帧处理方法
|
||||||
|
ProcessTemperatureFrame(frameToProcess, WIDTH, HEIGHT);
|
||||||
|
|
||||||
|
// 停止计时并记录处理时间
|
||||||
|
stopwatch.Stop();
|
||||||
|
Log($"温度数据处理完成,耗时: {stopwatch.ElapsedMilliseconds}ms");
|
||||||
|
}
|
||||||
|
|
||||||
|
// 短暂睡眠避免CPU占用过高
|
||||||
|
Thread.Sleep(50); // 可根据实际需求调整
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
Log($"温度数据处理线程异常: {ex.Message}");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Log("温度数据处理线程已停止");
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 停止温度数据处理线程
|
||||||
|
/// </summary>
|
||||||
|
private void StopTemperatureProcessing()
|
||||||
|
{
|
||||||
|
_shouldStopProcessing = true;
|
||||||
|
if (_temperatureProcessingThread != null && _temperatureProcessingThread.IsAlive)
|
||||||
|
{
|
||||||
|
_temperatureProcessingThread.Join(1000); // 等待线程退出,最多等待1秒
|
||||||
|
_temperatureProcessingThread = null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 清理所有资源,确保安全释放
|
/// 清理所有资源,确保安全释放
|
||||||
/// </summary>
|
/// </summary>
|
||||||
@@ -710,12 +804,11 @@ namespace JoyD.Windows.CS.Toprie
|
|||||||
Log($"[{DateTime.Now:HH:mm:ss.fff}] [线程:{Thread.CurrentThread.ManagedThreadId}] CleanupResources() - 开始清理资源");
|
Log($"[{DateTime.Now:HH:mm:ss.fff}] [线程:{Thread.CurrentThread.ManagedThreadId}] CleanupResources() - 开始清理资源");
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
// 停止所有定时器
|
// 停止所有定时器和处理线程
|
||||||
StopAutoReconnect();
|
StopAutoReconnect();
|
||||||
StopHeartbeat();
|
StopHeartbeat();
|
||||||
StopConnectionCheck();
|
StopConnectionCheck();
|
||||||
// 停止温度数据接收
|
StopTemperatureProcessing();
|
||||||
StopTemperatureDataReceiving();
|
|
||||||
|
|
||||||
// 安全释放SDK实例
|
// 安全释放SDK实例
|
||||||
A8SDK oldSdk = Interlocked.Exchange(ref _a8Sdk, null);
|
A8SDK oldSdk = Interlocked.Exchange(ref _a8Sdk, null);
|
||||||
@@ -1392,9 +1485,6 @@ namespace JoyD.Windows.CS.Toprie
|
|||||||
{
|
{
|
||||||
// 连接已关闭
|
// 连接已关闭
|
||||||
Log("远程主机关闭了连接");
|
Log("远程主机关闭了连接");
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// 清理连接资源
|
// 清理连接资源
|
||||||
CleanupConnectionResources(localStream, localTcpClient, out localStream, out localTcpClient);
|
CleanupConnectionResources(localStream, localTcpClient, out localStream, out localTcpClient);
|
||||||
continue;
|
continue;
|
||||||
@@ -1620,8 +1710,8 @@ namespace JoyD.Windows.CS.Toprie
|
|||||||
dataAccumulator.RemoveAt(0);
|
dataAccumulator.RemoveAt(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
// 解析处理完整的帧数据
|
// 只保存最后一帧数据,使用Interlocked.Exchange进行线程安全更新
|
||||||
//ProcessTemperatureFrame(frameData, WIDTH, HEIGHT);
|
Interlocked.Exchange(ref _lastTemperatureFrame, frameData);
|
||||||
|
|
||||||
// 跳转到4,继续处理下一个数据
|
// 跳转到4,继续处理下一个数据
|
||||||
}
|
}
|
||||||
@@ -1728,7 +1818,7 @@ namespace JoyD.Windows.CS.Toprie
|
|||||||
TemperatureData temperatureData = new TemperatureData(frameData, width, height, compensationValue);
|
TemperatureData temperatureData = new TemperatureData(frameData, width, height, compensationValue);
|
||||||
Log($"温度数据对象创建成功,分辨率: {width}x{height}");
|
Log($"温度数据对象创建成功,分辨率: {width}x{height}");
|
||||||
|
|
||||||
// 不再需要触发温度数据接收事件,移除通知机制
|
LastTemperature = temperatureData;
|
||||||
Log($"温度数据处理完成,不再触发事件通知");
|
Log($"温度数据处理完成,不再触发事件通知");
|
||||||
}
|
}
|
||||||
catch (Exception ex)
|
catch (Exception ex)
|
||||||
@@ -2665,8 +2755,6 @@ namespace JoyD.Windows.CS.Toprie
|
|||||||
_isReceivingImages = false;
|
_isReceivingImages = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
// 同步停止温度数据接收
|
|
||||||
StopTemperatureDataReceiving();
|
|
||||||
|
|
||||||
// 通知线程停止
|
// 通知线程停止
|
||||||
ManualResetEvent stopEvent = null;
|
ManualResetEvent stopEvent = null;
|
||||||
@@ -5757,6 +5845,8 @@ namespace JoyD.Windows.CS.Toprie
|
|||||||
|
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
|
// 同步停止温度数据接收
|
||||||
|
StopTemperatureDataReceiving();
|
||||||
// 首先停止所有活动的线程和定时器
|
// 首先停止所有活动的线程和定时器
|
||||||
Log("[线程安全] Dispose() - 停止所有活动组件");
|
Log("[线程安全] Dispose() - 停止所有活动组件");
|
||||||
|
|
||||||
@@ -5765,6 +5855,7 @@ namespace JoyD.Windows.CS.Toprie
|
|||||||
try { StopConnectionCheck(); } catch (Exception ex) { Log($"停止连接检查异常: {ex.Message}"); }
|
try { StopConnectionCheck(); } catch (Exception ex) { Log($"停止连接检查异常: {ex.Message}"); }
|
||||||
// 直接调用内部方法避免嵌套锁
|
// 直接调用内部方法避免嵌套锁
|
||||||
try { StopAutoReconnectInternal(); } catch (Exception ex) { Log($"停止自动重连异常: {ex.Message}"); }
|
try { StopAutoReconnectInternal(); } catch (Exception ex) { Log($"停止自动重连异常: {ex.Message}"); }
|
||||||
|
// 温度数据处理不再使用定时器,不需要停止操作
|
||||||
|
|
||||||
if (disposing)
|
if (disposing)
|
||||||
{
|
{
|
||||||
|
|||||||
Reference in New Issue
Block a user