修复代码问题:1. 移除Camera.cs中重复定义的_isPaused变量 2. 优化TemperatureData.cs中的变量声明 3. 修复DeviceManager.cs中温度数据只接收一次的问题

This commit is contained in:
zqm
2025-10-31 14:21:33 +08:00
parent 78c46dad6c
commit 4950d731eb
3 changed files with 38 additions and 20 deletions

View File

@@ -45,6 +45,9 @@ namespace JoyD.Windows.CS.Toprie
// 是否显示信息图像 // 是否显示信息图像
private bool _isDisplayingInfo = false; private bool _isDisplayingInfo = false;
// 是否暂停检测
private bool _isPaused = false;
// 项目路径,用于数据文件的存取 // 项目路径,用于数据文件的存取
private string _projectPath = ""; private string _projectPath = "";
@@ -645,7 +648,6 @@ namespace JoyD.Windows.CS.Toprie
} }
} }
private bool _isPaused = false; // 暂停状态标志
// 记录上次启动温度数据接收的时间,用于防止短时间内重复调用 // 记录上次启动温度数据接收的时间,用于防止短时间内重复调用
private DateTime _lastTemperatureStartCall = DateTime.MinValue; private DateTime _lastTemperatureStartCall = DateTime.MinValue;
private readonly object _temperatureCallLock = new object(); private readonly object _temperatureCallLock = new object();

View File

@@ -1120,6 +1120,8 @@ namespace JoyD.Windows.CS.Toprie
{ {
_temperatureTcpClient = localTcpClient; _temperatureTcpClient = localTcpClient;
_temperatureStream = localStream; _temperatureStream = localStream;
// 确保接收状态为true
_isReceivingTemperatureData = true;
} }
// 发送开始温度数据传输的命令 // 发送开始温度数据传输的命令
@@ -1129,35 +1131,36 @@ namespace JoyD.Windows.CS.Toprie
Log("已发送开始温度数据传输命令,开始接收温度数据"); Log("已发送开始温度数据传输命令,开始接收温度数据");
// 使用局部变量引用停止事件,避免在循环中重复加锁
ManualResetEvent currentStopEvent = null;
lock (_lockObject)
{
currentStopEvent = _stopTemperatureEvent;
}
// 循环读取数据,使用更安全的退出机制 // 循环读取数据,使用更安全的退出机制
bool shouldContinue = true; bool shouldContinue = true;
while (shouldContinue) 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("接收到停止信号,准备退出温度数据接收循环"); Log("接收到停止信号,准备退出温度数据接收循环");
shouldContinue = false; shouldContinue = false;
break; break;
} }
// 检查是否仍在接收状态 if (!isReceiving)
lock (_lockObject)
{ {
if (!_isReceivingTemperatureData) Log("接收状态已更改(isReceiving=false),准备退出温度数据接收循环");
{
Log("接收状态已更改,准备退出温度数据接收循环");
shouldContinue = false; shouldContinue = false;
break; break;
} }
}
try try
{ {
@@ -1188,6 +1191,8 @@ namespace JoyD.Windows.CS.Toprie
byte[] receivedBytes = new byte[bytesRead]; byte[] receivedBytes = new byte[bytesRead];
Array.Copy(buffer, receivedBytes, bytesRead); Array.Copy(buffer, receivedBytes, bytesRead);
Log($"接收到温度数据字节数: {bytesRead}");
// 线程安全地更新累积器或直接处理 // 线程安全地更新累积器或直接处理
lock (temperatureDataAccumulator) lock (temperatureDataAccumulator)
{ {
@@ -1280,27 +1285,39 @@ namespace JoyD.Windows.CS.Toprie
try try
{ {
Log($"开始处理温度数据,当前累积数据量: {dataAccumulator.Count} 字节,所需帧大小: {TEMPERATURE_DATA_FRAME_SIZE} 字节");
// 检查是否有足够的数据构成完整的温度数据帧 // 检查是否有足够的数据构成完整的温度数据帧
while (dataAccumulator.Count >= TEMPERATURE_DATA_FRAME_SIZE) while (dataAccumulator.Count >= TEMPERATURE_DATA_FRAME_SIZE)
{ {
Log($"找到完整的温度数据帧,开始处理");
// 提取一帧温度数据 // 提取一帧温度数据
byte[] temperatureFrame = dataAccumulator.GetRange(0, TEMPERATURE_DATA_FRAME_SIZE).ToArray(); byte[] temperatureFrame = dataAccumulator.GetRange(0, TEMPERATURE_DATA_FRAME_SIZE).ToArray();
dataAccumulator.RemoveRange(0, TEMPERATURE_DATA_FRAME_SIZE); dataAccumulator.RemoveRange(0, TEMPERATURE_DATA_FRAME_SIZE);
Log($"提取温度数据帧完成,剩余累积数据量: {dataAccumulator.Count} 字节");
// 获取温度补偿值 // 获取温度补偿值
float compensationValue = GetTemperatureCompensationValue(); float compensationValue = GetTemperatureCompensationValue();
Log($"获取到温度补偿值: {compensationValue}");
// 创建温度数据对象,使用正确的分辨率参数 // 创建温度数据对象,使用正确的分辨率参数
TemperatureData temperatureData = new TemperatureData(temperatureFrame, WIDTH, HEIGHT, compensationValue); TemperatureData temperatureData = new TemperatureData(temperatureFrame, WIDTH, HEIGHT, compensationValue);
Log($"温度数据对象创建成功,分辨率: {WIDTH}x{HEIGHT}");
// 触发温度数据接收事件 // 触发温度数据接收事件
OnTemperatureReceived(new TemperatureReceivedEventArgs(temperatureData, temperatureFrame, compensationValue)); OnTemperatureReceived(new TemperatureReceivedEventArgs(temperatureData, temperatureFrame, compensationValue));
Log($"温度数据接收事件触发完成");
} }
Log($"温度数据处理完成");
} }
catch (Exception ex) catch (Exception ex)
{ {
Log($"[{DateTime.Now:HH:mm:ss.fff}] [线程:{Thread.CurrentThread.ManagedThreadId}] ProcessReceivedTemperatureData() - 异常: {ex.Message}"); Log($"[{DateTime.Now:HH:mm:ss.fff}] [线程:{Thread.CurrentThread.ManagedThreadId}] ProcessReceivedTemperatureData() - 异常: {ex.Message}");
// 清空累积器,重新开始 // 清空累积器,重新开始
Log("清空温度数据累积器,准备重新接收");
dataAccumulator.Clear(); dataAccumulator.Clear();
} }
} }

View File

@@ -394,8 +394,7 @@ namespace JoyD.Windows.CS.Toprie
}; };
// 如果匹配标准分辨率,安全地返回对应值 // 如果匹配标准分辨率,安全地返回对应值
int[] resolution; if (standardResolutions.TryGetValue(pixelCount, out int[] resolution))
if (standardResolutions.TryGetValue(pixelCount, out resolution))
{ {
return resolution; return resolution;
} }