修复代码问题: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 _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();

View File

@@ -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();
}
}

View File

@@ -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;
}