diff --git a/AutoRobot/Windows/Robot/Web/src/DockLayout/ToDoList.md b/AutoRobot/Windows/Robot/Web/src/DockLayout/ToDoList.md index 08ff966..e8f05a9 100644 --- a/AutoRobot/Windows/Robot/Web/src/DockLayout/ToDoList.md +++ b/AutoRobot/Windows/Robot/Web/src/DockLayout/ToDoList.md @@ -4,8 +4,8 @@ 3. 还原时,恢复到最大化前的位置和大小。 4. 关闭时,从父容器中移除。 5. 拖拽时,允许在父容器内移动,不允许超出父容器边界。 -6. 当内容区只包含一个Panel时,不显示Area的标题栏。 -7. 当内容区只包含一个Panel时,拖动Panel标题栏可以移动Area。 +6. 当内容区只包含一个Panel时,显示Area的标题栏。 +7. 当内容区只包含一个Panel时,拖动Panel标题栏就相当于拖动Area。 ### Panel diff --git a/Windows/CS/Framework4.0/Toprie/Toprie/DeviceManager.cs b/Windows/CS/Framework4.0/Toprie/Toprie/DeviceManager.cs index 76cdccd..d7154f5 100644 --- a/Windows/CS/Framework4.0/Toprie/Toprie/DeviceManager.cs +++ b/Windows/CS/Framework4.0/Toprie/Toprie/DeviceManager.cs @@ -1269,7 +1269,8 @@ namespace JoyD.Windows.CS.Toprie // 检测暂停状态是否发生变化 bool currentPaused = IsTemperatureReceivingPaused(); - if (currentPaused != lastPaused) + bool pausedChanged = currentPaused != lastPaused; + if (pausedChanged) { if (currentPaused) { @@ -1289,12 +1290,14 @@ namespace JoyD.Windows.CS.Toprie { // 减少暂停状态下的日志记录频率,避免日志过于冗长 DateTime currentTime = DateTime.Now; - if ((currentTime - lastPausedLogTime).TotalMilliseconds > PAUSED_LOG_INTERVAL_MS) + if (pausedChanged) { - Log("温度接收已暂停,等待恢复"); - lastPausedLogTime = currentTime; + if ((currentTime - lastPausedLogTime).TotalMilliseconds > PAUSED_LOG_INTERVAL_MS) + { + Log("温度接收已暂停,等待恢复"); + lastPausedLogTime = currentTime; + } } - // 在暂停状态的Sleep前检查是否收到停止信号 if (ShouldStop()) { @@ -1320,7 +1323,7 @@ namespace JoyD.Windows.CS.Toprie else { // 只有从暂停状态恢复时(状态从true变为false的瞬间),才检查和重建连接 - if (lastPaused && !isPaused && localTcpClient != null && !IsTcpClientConnected(localTcpClient)) + if (pausedChanged && localTcpClient != null && !IsTcpClientConnected(localTcpClient)) { Log("恢复接收时检测到连接无效,需要重建连接"); CleanupConnectionResources(localStream, localTcpClient, out localStream, out localTcpClient); @@ -1329,7 +1332,7 @@ namespace JoyD.Windows.CS.Toprie } // 根据SDK文档,建立TCP连接后不需要发送任何开始命令 // 从暂停状态恢复时,只需继续监听数据流即可 - if (lastPaused && !isPaused) + if (pausedChanged) { Log("从暂停状态恢复,继续接收温度数据"); } @@ -1494,11 +1497,22 @@ namespace JoyD.Windows.CS.Toprie private const int HEIGHT = 192; /// 累积的温度数据包列表 + // 重入保护标志 + private bool _isProcessingTemperatureData = false; + private void ProcessReceivedTemperatureData(List dataAccumulator) { + // 检查是否已经在处理中,防止重入 + if (_isProcessingTemperatureData) + { + Log($"检测到ProcessReceivedTemperatureData重入,跳过此次调用"); + return; + } try { + // 设置重入保护标志 + _isProcessingTemperatureData = true; Log($"开始处理温度数据,当前累积数据包数量: {dataAccumulator.Count}"); // 按照README中温度数据处理逻辑执行 @@ -1619,6 +1633,12 @@ namespace JoyD.Windows.CS.Toprie Log("清空温度数据累积器,准备重新接收"); dataAccumulator.Clear(); } + finally + { + // 重置重入保护标志 + _isProcessingTemperatureData = false; + Log($"温度数据处理完成,重入保护标志已重置"); + } } /// @@ -1637,7 +1657,7 @@ namespace JoyD.Windows.CS.Toprie endIndex = data.Length; // 确保有足够的数据检查头信息 - int searchEnd = endIndex - 4; // 至少需要4个字节检查标记 + int searchEnd = endIndex - 5; // 至少需要5个字节检查标记("+TEMP") if (searchEnd < startIndex) return -1; @@ -1727,12 +1747,12 @@ namespace JoyD.Windows.CS.Toprie if (data == null || position + 5 > data.Length) return false; - // 验证"+TEMP"标记 + // 验证"+TEMP"标记(5个字符) return data[position] == '+' && data[position + 1] == 'T' && data[position + 2] == 'E' && data[position + 3] == 'M' && - data[position + 4] == 0; // 假设第5个字节是结束符 + data[position + 4] == 'P'; // 第5个字节应为'P' } ///