diff --git a/Windows/CS/Framework4.0/Toprie/Toprie/Camera.cs b/Windows/CS/Framework4.0/Toprie/Toprie/Camera.cs index a831993..223a7f9 100644 --- a/Windows/CS/Framework4.0/Toprie/Toprie/Camera.cs +++ b/Windows/CS/Framework4.0/Toprie/Toprie/Camera.cs @@ -45,6 +45,9 @@ namespace JoyD.Windows.CS.Toprie // 是否显示信息图像 private bool _isDisplayingInfo = false; + // 是否暂停检测 + private bool _isPaused = false; + // 项目路径,用于数据文件的存取 private string _projectPath = ""; @@ -645,7 +648,6 @@ namespace JoyD.Windows.CS.Toprie } } - private bool _isPaused = false; // 暂停状态标志 // 记录上次启动温度数据接收的时间,用于防止短时间内重复调用 private DateTime _lastTemperatureStartCall = DateTime.MinValue; private readonly object _temperatureCallLock = new object(); diff --git a/Windows/CS/Framework4.0/Toprie/Toprie/DeviceManager.cs b/Windows/CS/Framework4.0/Toprie/Toprie/DeviceManager.cs index 8d7aa05..633b23d 100644 --- a/Windows/CS/Framework4.0/Toprie/Toprie/DeviceManager.cs +++ b/Windows/CS/Framework4.0/Toprie/Toprie/DeviceManager.cs @@ -1120,6 +1120,8 @@ namespace JoyD.Windows.CS.Toprie { _temperatureTcpClient = localTcpClient; _temperatureStream = localStream; + // 确保接收状态为true + _isReceivingTemperatureData = true; } // 发送开始温度数据传输的命令 @@ -1129,34 +1131,35 @@ namespace JoyD.Windows.CS.Toprie Log("已发送开始温度数据传输命令,开始接收温度数据"); - // 使用局部变量引用停止事件,避免在循环中重复加锁 - ManualResetEvent currentStopEvent = null; - lock (_lockObject) - { - currentStopEvent = _stopTemperatureEvent; - } - // 循环读取数据,使用更安全的退出机制 bool shouldContinue = true; while (shouldContinue) { - // 检查停止信号 - if (currentStopEvent != null && currentStopEvent.WaitOne(0)) + // 检查停止信号和接收状态 + bool stopRequested = false; + bool isReceiving = true; + + lock (_lockObject) + { + if (_stopTemperatureEvent != null && _stopTemperatureEvent.WaitOne(0)) + { + stopRequested = true; + } + isReceiving = _isReceivingTemperatureData; + } + + if (stopRequested) { Log("接收到停止信号,准备退出温度数据接收循环"); shouldContinue = false; break; } - // 检查是否仍在接收状态 - lock (_lockObject) + if (!isReceiving) { - if (!_isReceivingTemperatureData) - { - Log("接收状态已更改,准备退出温度数据接收循环"); - shouldContinue = false; - break; - } + Log("接收状态已更改(isReceiving=false),准备退出温度数据接收循环"); + shouldContinue = false; + break; } try @@ -1188,6 +1191,8 @@ namespace JoyD.Windows.CS.Toprie byte[] receivedBytes = new byte[bytesRead]; Array.Copy(buffer, receivedBytes, bytesRead); + Log($"接收到温度数据字节数: {bytesRead}"); + // 线程安全地更新累积器或直接处理 lock (temperatureDataAccumulator) { @@ -1280,27 +1285,39 @@ namespace JoyD.Windows.CS.Toprie try { + Log($"开始处理温度数据,当前累积数据量: {dataAccumulator.Count} 字节,所需帧大小: {TEMPERATURE_DATA_FRAME_SIZE} 字节"); + // 检查是否有足够的数据构成完整的温度数据帧 while (dataAccumulator.Count >= TEMPERATURE_DATA_FRAME_SIZE) { + Log($"找到完整的温度数据帧,开始处理"); + // 提取一帧温度数据 byte[] temperatureFrame = dataAccumulator.GetRange(0, TEMPERATURE_DATA_FRAME_SIZE).ToArray(); dataAccumulator.RemoveRange(0, TEMPERATURE_DATA_FRAME_SIZE); + Log($"提取温度数据帧完成,剩余累积数据量: {dataAccumulator.Count} 字节"); + // 获取温度补偿值 float compensationValue = GetTemperatureCompensationValue(); + Log($"获取到温度补偿值: {compensationValue}"); // 创建温度数据对象,使用正确的分辨率参数 TemperatureData temperatureData = new TemperatureData(temperatureFrame, WIDTH, HEIGHT, compensationValue); + Log($"温度数据对象创建成功,分辨率: {WIDTH}x{HEIGHT}"); // 触发温度数据接收事件 OnTemperatureReceived(new TemperatureReceivedEventArgs(temperatureData, temperatureFrame, compensationValue)); + Log($"温度数据接收事件触发完成"); } + + Log($"温度数据处理完成"); } catch (Exception ex) { Log($"[{DateTime.Now:HH:mm:ss.fff}] [线程:{Thread.CurrentThread.ManagedThreadId}] ProcessReceivedTemperatureData() - 异常: {ex.Message}"); // 清空累积器,重新开始 + Log("清空温度数据累积器,准备重新接收"); dataAccumulator.Clear(); } } diff --git a/Windows/CS/Framework4.0/Toprie/Toprie/TemperatureData.cs b/Windows/CS/Framework4.0/Toprie/Toprie/TemperatureData.cs index 9a54e74..ef2f77a 100644 --- a/Windows/CS/Framework4.0/Toprie/Toprie/TemperatureData.cs +++ b/Windows/CS/Framework4.0/Toprie/Toprie/TemperatureData.cs @@ -394,8 +394,7 @@ namespace JoyD.Windows.CS.Toprie }; // 如果匹配标准分辨率,安全地返回对应值 - int[] resolution; - if (standardResolutions.TryGetValue(pixelCount, out resolution)) + if (standardResolutions.TryGetValue(pixelCount, out int[] resolution)) { return resolution; }