实现温度数据接收暂停功能,保持TCP连接但不处理数据

This commit is contained in:
zqm
2025-10-31 16:27:09 +08:00
parent 079c15fe09
commit be0696663a
3 changed files with 104 additions and 26 deletions

View File

@@ -296,7 +296,7 @@ namespace JoyD.Windows.CS.Toprie
if (_isReceivingImage)
{
_deviceManager.StopImageReceiving();
_deviceManager.StopTemperatureDataReceiving();
_deviceManager.PauseTemperatureDataReceiving();
_isReceivingImage = false;
}
}
@@ -316,9 +316,8 @@ namespace JoyD.Windows.CS.Toprie
if (_deviceManager.ConnectionStatus == ConnectionStatus.Connected)
{
_deviceManager.StopImageReceiving();
_deviceManager.StopTemperatureDataReceiving();
_deviceManager.StartImageReceiving();
_deviceManager.StartTemperatureDataReceiving();
_deviceManager.ResumeTemperatureDataReceiving();
_isReceivingImage = true;
// 恢复检测后,启动连接检查以确保连接正常
@@ -612,7 +611,7 @@ namespace JoyD.Windows.CS.Toprie
}
else
{
_deviceManager.StopTemperatureDataReceiving();
//_deviceManager.StopTemperatureDataReceiving();
_deviceManager.StartTemperatureDataReceiving();
_lastTemperatureStartCall = DateTime.Now;
}

View File

@@ -266,6 +266,7 @@ namespace JoyD.Windows.CS.Toprie
private TcpClient _temperatureTcpClient;
private NetworkStream _temperatureStream;
private bool _isReceivingTemperatureData = false;
private bool _isTemperatureReceivingPaused = false; // 暂停标志,用于控制是否处理接收到的温度数据
private ManualResetEvent _stopTemperatureEvent;
private const int TEMPERATURE_TCP_PORT = 8081; // 温度数据TCP端口 - 修正为热像仪SDK文档中指定的端口
@@ -902,7 +903,6 @@ namespace JoyD.Windows.CS.Toprie
{
// 确保之前的连接已关闭
StopTemperatureDataReceiving();
// 在锁内执行所有关键状态更新,确保原子性
lock (_lockObject)
{
@@ -911,6 +911,7 @@ namespace JoyD.Windows.CS.Toprie
_stopTemperatureEvent = new ManualResetEvent(false);
_isReceivingTemperatureData = true;
}
Thread.Sleep(500);
// 创建并启动温度数据接收线程
Thread newThread = new Thread(ReceiveTemperatureDataWithTcp)
@@ -924,7 +925,7 @@ namespace JoyD.Windows.CS.Toprie
{
_temperatureReceiveThread = newThread;
}
// 启动线程
newThread.Start();
}
@@ -952,6 +953,71 @@ namespace JoyD.Windows.CS.Toprie
/// <summary>
/// 停止接收温度数据
/// </summary>
/// <summary>
/// 暂停温度数据接收处理保持TCP连接但不处理数据
/// </summary>
public void PauseTemperatureDataReceiving()
{
Log($"[{DateTime.Now:HH:mm:ss.fff}] [线程:{Thread.CurrentThread.ManagedThreadId}] PauseTemperatureDataReceiving() - 开始执行");
if (_isDisposed)
{
Log($"[{DateTime.Now:HH:mm:ss.fff}] [线程:{Thread.CurrentThread.ManagedThreadId}] PauseTemperatureDataReceiving() - 对象已释放,跳过操作");
return;
}
try
{
lock (_lockObject)
{
_isTemperatureReceivingPaused = true;
}
Log("温度数据接收已暂停保持TCP连接但不处理数据");
}
catch (Exception ex)
{
Log($"[{DateTime.Now:HH:mm:ss.fff}] [线程:{Thread.CurrentThread.ManagedThreadId}] PauseTemperatureDataReceiving() - 异常: {ex.Message}");
}
finally
{
Log($"[{DateTime.Now:HH:mm:ss.fff}] [线程:{Thread.CurrentThread.ManagedThreadId}] PauseTemperatureDataReceiving() - 执行完成");
}
}
/// <summary>
/// 恢复温度数据接收处理
/// </summary>
public void ResumeTemperatureDataReceiving()
{
Log($"[{DateTime.Now:HH:mm:ss.fff}] [线程:{Thread.CurrentThread.ManagedThreadId}] ResumeTemperatureDataReceiving() - 开始执行");
if (_isDisposed)
{
Log($"[{DateTime.Now:HH:mm:ss.fff}] [线程:{Thread.CurrentThread.ManagedThreadId}] ResumeTemperatureDataReceiving() - 对象已释放,跳过操作");
return;
}
try
{
lock (_lockObject)
{
_isTemperatureReceivingPaused = false;
}
Log("温度数据接收已恢复,开始处理数据");
}
catch (Exception ex)
{
Log($"[{DateTime.Now:HH:mm:ss.fff}] [线程:{Thread.CurrentThread.ManagedThreadId}] ResumeTemperatureDataReceiving() - 异常: {ex.Message}");
}
finally
{
Log($"[{DateTime.Now:HH:mm:ss.fff}] [线程:{Thread.CurrentThread.ManagedThreadId}] ResumeTemperatureDataReceiving() - 执行完成");
}
}
/// <summary>
/// 停止接收温度数据断开TCP连接
/// </summary>
public void StopTemperatureDataReceiving()
{
Log($"[{DateTime.Now:HH:mm:ss.fff}] [线程:{Thread.CurrentThread.ManagedThreadId}] StopTemperatureDataReceiving() - 开始执行");
@@ -974,6 +1040,7 @@ namespace JoyD.Windows.CS.Toprie
lock (_lockObject)
{
_isReceivingTemperatureData = false;
_isTemperatureReceivingPaused = false; // 同时重置暂停状态
stopEventToDispose = _stopTemperatureEvent;
threadToJoin = _temperatureReceiveThread;
streamToClose = _temperatureStream;
@@ -1088,10 +1155,7 @@ namespace JoyD.Windows.CS.Toprie
List<byte> temperatureDataAccumulator = new List<byte>();
// 根据分析温度数据帧大小为98313字节(9字节头部+256×192×2字节数据),增大缓冲区提高接收效率
byte[] buffer = new byte[65536]; // 增大温度数据缓冲区减少Read操作次数
// 心跳检查时间记录,用于定期验证连接有效性
DateTime lastConnectionCheckTime = DateTime.Now;
try
{
// 创建TCP客户端并连接到设备的温度数据端口
@@ -1196,13 +1260,28 @@ namespace JoyD.Windows.CS.Toprie
Array.Copy(buffer, receivedBytes, bytesRead);
Log($"接收到温度数据字节数: {bytesRead}");
// 线程安全地更新累积器或直接处理
lock (temperatureDataAccumulator)
{
temperatureDataAccumulator.AddRange(receivedBytes);
ProcessReceivedTemperatureData(temperatureDataAccumulator);
}
// 检查是否处于暂停状态
bool isPaused = false;
lock (_lockObject)
{
isPaused = _isTemperatureReceivingPaused;
}
if (isPaused)
{
Log("温度数据接收处于暂停状态,数据已接收但不处理");
// 数据已接收但不处理,直接丢弃
}
else
{
// 线程安全地更新累积器或直接处理
lock (temperatureDataAccumulator)
{
temperatureDataAccumulator.AddRange(receivedBytes);
ProcessReceivedTemperatureData(temperatureDataAccumulator);
}
}
}
else
{
@@ -1217,13 +1296,6 @@ namespace JoyD.Windows.CS.Toprie
// 如果没有数据可读短暂休眠避免CPU占用过高
Thread.Sleep(10);
}
// 定期检查连接状态,确保连接仍然有效
if (DateTime.Now - lastConnectionCheckTime > TimeSpan.FromSeconds(30))
{
Log("定期检查温度数据连接状态");
lastConnectionCheckTime = DateTime.Now;
}
}
catch (TimeoutException)
{
@@ -2333,7 +2405,7 @@ namespace JoyD.Windows.CS.Toprie
{
_isReceivingImages = false;
}
// 同步停止温度数据接收
StopTemperatureDataReceiving();

View File

@@ -19,4 +19,11 @@
### 更新UI:
1. 先将LastImage绘制到全局缓冲
2. 再将InfoImage绘制到缓冲
3. 最后一次性绘制到图像框的bitmap
3. 最后一次性绘制到图像框的bitmap
### Tcp温度数据接收
1. 系统初始化时,创建后台线程。
2. 设置接收状态为false,然后线程循环执行
3. 如果接收状态为false,如果暂停则Sleep 1秒后继续,否则同步创建tcp连接并同步接收和处理数据。
4. 如果接收状态为true,如果暂停,接收后丢弃。否则同步接收并处理数据。
4. Dispose时关闭后台线程。