实现温度数据接收暂停功能,保持TCP连接但不处理数据
This commit is contained in:
@@ -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;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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,12 +1261,27 @@ namespace JoyD.Windows.CS.Toprie
|
|||||||
|
|
||||||
Log($"接收到温度数据字节数: {bytesRead}");
|
Log($"接收到温度数据字节数: {bytesRead}");
|
||||||
|
|
||||||
// 线程安全地更新累积器或直接处理
|
// 检查是否处于暂停状态
|
||||||
lock (temperatureDataAccumulator)
|
bool isPaused = false;
|
||||||
{
|
lock (_lockObject)
|
||||||
temperatureDataAccumulator.AddRange(receivedBytes);
|
{
|
||||||
ProcessReceivedTemperatureData(temperatureDataAccumulator);
|
isPaused = _isTemperatureReceivingPaused;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (isPaused)
|
||||||
|
{
|
||||||
|
Log("温度数据接收处于暂停状态,数据已接收但不处理");
|
||||||
|
// 数据已接收但不处理,直接丢弃
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// 线程安全地更新累积器或直接处理
|
||||||
|
lock (temperatureDataAccumulator)
|
||||||
|
{
|
||||||
|
temperatureDataAccumulator.AddRange(receivedBytes);
|
||||||
|
ProcessReceivedTemperatureData(temperatureDataAccumulator);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@@ -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)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -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时,关闭后台线程。
|
||||||
|
|
||||||
Reference in New Issue
Block a user