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