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'
}
///