实现温度数据接收暂停功能,保持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) if (_isReceivingImage)
{ {
_deviceManager.StopImageReceiving(); _deviceManager.StopImageReceiving();
_deviceManager.StopTemperatureDataReceiving(); _deviceManager.PauseTemperatureDataReceiving();
_isReceivingImage = false; _isReceivingImage = false;
} }
} }
@@ -316,9 +316,8 @@ namespace JoyD.Windows.CS.Toprie
if (_deviceManager.ConnectionStatus == ConnectionStatus.Connected) if (_deviceManager.ConnectionStatus == ConnectionStatus.Connected)
{ {
_deviceManager.StopImageReceiving(); _deviceManager.StopImageReceiving();
_deviceManager.StopTemperatureDataReceiving();
_deviceManager.StartImageReceiving(); _deviceManager.StartImageReceiving();
_deviceManager.StartTemperatureDataReceiving(); _deviceManager.ResumeTemperatureDataReceiving();
_isReceivingImage = true; _isReceivingImage = true;
// 恢复检测后,启动连接检查以确保连接正常 // 恢复检测后,启动连接检查以确保连接正常
@@ -612,7 +611,7 @@ namespace JoyD.Windows.CS.Toprie
} }
else else
{ {
_deviceManager.StopTemperatureDataReceiving(); //_deviceManager.StopTemperatureDataReceiving();
_deviceManager.StartTemperatureDataReceiving(); _deviceManager.StartTemperatureDataReceiving();
_lastTemperatureStartCall = DateTime.Now; _lastTemperatureStartCall = DateTime.Now;
} }

View File

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

View File

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