实现温度数据接收暂停功能,保持TCP连接但不处理数据
This commit is contained in:
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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();
|
||||
|
||||
|
||||
@@ -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时,关闭后台线程。
|
||||
|
||||
Reference in New Issue
Block a user