diff --git a/Windows/CS/Framework4.0/Toprie/Toprie/Camera.cs b/Windows/CS/Framework4.0/Toprie/Toprie/Camera.cs
index 223a7f9..214b61e 100644
--- a/Windows/CS/Framework4.0/Toprie/Toprie/Camera.cs
+++ b/Windows/CS/Framework4.0/Toprie/Toprie/Camera.cs
@@ -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;
}
diff --git a/Windows/CS/Framework4.0/Toprie/Toprie/DeviceManager.cs b/Windows/CS/Framework4.0/Toprie/Toprie/DeviceManager.cs
index 8915e75..e408453 100644
--- a/Windows/CS/Framework4.0/Toprie/Toprie/DeviceManager.cs
+++ b/Windows/CS/Framework4.0/Toprie/Toprie/DeviceManager.cs
@@ -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
///
/// 停止接收温度数据
///
+ ///
+ /// 暂停温度数据接收处理(保持TCP连接,但不处理数据)
+ ///
+ 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() - 执行完成");
+ }
+ }
+
+ ///
+ /// 恢复温度数据接收处理
+ ///
+ 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() - 执行完成");
+ }
+ }
+
+ ///
+ /// 停止接收温度数据(断开TCP连接)
+ ///
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 temperatureDataAccumulator = new List();
// 根据分析,温度数据帧大小为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();
diff --git a/Windows/CS/Framework4.0/Toprie/Toprie/README.md b/Windows/CS/Framework4.0/Toprie/Toprie/README.md
index bab992b..9c6d3a6 100644
--- a/Windows/CS/Framework4.0/Toprie/Toprie/README.md
+++ b/Windows/CS/Framework4.0/Toprie/Toprie/README.md
@@ -19,4 +19,11 @@
### 更新UI:
1. 先将LastImage绘制到全局缓冲
2. 再将InfoImage绘制到缓冲
- 3. 最后一次性绘制到图像框的bitmap
\ No newline at end of file
+ 3. 最后一次性绘制到图像框的bitmap
+ ### Tcp温度数据接收
+ 1. 系统初始化时,创建后台线程。
+ 2. 设置接收状态为false,然后线程循环执行
+ 3. 如果接收状态为false,如果暂停则Sleep 1秒后继续,否则同步创建tcp连接,并同步接收和处理数据。
+ 4. 如果接收状态为true,如果暂停,接收后丢弃。否则同步接收并处理数据。
+ 4. Dispose时,关闭后台线程。
+
\ No newline at end of file