修复连接不稳定问题
This commit is contained in:
@@ -312,7 +312,6 @@ namespace JoyD.Windows.CS.Toprie
|
||||
DeviceManager.IsDesignMode = DesignMode;
|
||||
Console.WriteLine($"相机控件设计模式状态已更新: {DesignMode}");
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 更新InfoImage显示 - 按照用户要求的详细步骤:
|
||||
/// 1. 以透明色清空Info
|
||||
@@ -397,6 +396,7 @@ namespace JoyD.Windows.CS.Toprie
|
||||
new RectangleF(0, BUFFER_HEIGHT / 3, BUFFER_WIDTH, BUFFER_HEIGHT / 3),
|
||||
format);
|
||||
}
|
||||
Console.WriteLine($"当前状态:{text}");
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -367,9 +367,9 @@ namespace JoyD.Windows.CS.Toprie
|
||||
private Thread _temperatureProcessingThread; // 温度数据处理线程
|
||||
private volatile bool _shouldStopProcessing = false; // 控制处理线程停止的标志
|
||||
// 设备连接状态
|
||||
private ConnectionStatus _connectionStatus = ConnectionStatus.Disconnected;
|
||||
private volatile ConnectionStatus _connectionStatus = ConnectionStatus.Disconnected;
|
||||
// 是否已初始化
|
||||
private bool _isInitialized = false;
|
||||
private volatile bool _isInitialized = false;
|
||||
// 是否已释放
|
||||
private readonly bool _isDisposed = false;
|
||||
// 图像模式
|
||||
@@ -2728,34 +2728,9 @@ namespace JoyD.Windows.CS.Toprie
|
||||
if (!_isDisposed && _connectionStatus == ConnectionStatus.Connected)
|
||||
{
|
||||
Log($"[{DateTime.Now:HH:mm:ss.fff}] [线程:{Thread.CurrentThread.ManagedThreadId}] CheckConnectionWrapper() - 检测到连接已断开: _connectionStatus={_connectionStatus}, isStillConnected={isStillConnected}, _isInitialized={_isInitialized}");
|
||||
// 断开连接时重置初始化状态和SDK实例
|
||||
// 断开连接时,只重置初始化状态,不立即释放SDK实例
|
||||
// 保留SDK实例可以避免下次连接时重新创建的开销
|
||||
_isInitialized = false;
|
||||
Log($"[{DateTime.Now:HH:mm:ss.fff}] [线程:{Thread.CurrentThread.ManagedThreadId}] CheckConnectionWrapper() - 重置初始化状态为false");
|
||||
|
||||
// 安全释放SDK实例
|
||||
A8SDK oldSdk = _a8Sdk;
|
||||
_a8Sdk = null;
|
||||
|
||||
// 在锁外释放资源
|
||||
if (oldSdk != null)
|
||||
{
|
||||
ThreadPool.QueueUserWorkItem((obj) =>
|
||||
{
|
||||
try
|
||||
{
|
||||
// 注意:A8SDK类没有Dispose方法,这里只记录日志
|
||||
Log($"[{DateTime.Now:HH:mm:ss.fff}] [线程:{Thread.CurrentThread.ManagedThreadId}] CheckConnectionWrapper() - SDK实例引用已处理");
|
||||
}
|
||||
catch (Exception disposeEx)
|
||||
{
|
||||
Log($"[{DateTime.Now:HH:mm:ss.fff}] [线程:{Thread.CurrentThread.ManagedThreadId}] SDK资源释放异常: {disposeEx.Message}");
|
||||
}
|
||||
});
|
||||
}
|
||||
else
|
||||
{
|
||||
Log($"[{DateTime.Now:HH:mm:ss.fff}] [线程:{Thread.CurrentThread.ManagedThreadId}] CheckConnectionWrapper() - SDK实例已为空,无需释放");
|
||||
}
|
||||
|
||||
UpdateConnectionStatus(ConnectionStatus.Disconnected, "连接已断开:设备离线");
|
||||
|
||||
@@ -2798,22 +2773,17 @@ namespace JoyD.Windows.CS.Toprie
|
||||
// 注意:此方法被CheckConnectionWrapper调用,已经在线程安全的上下文中
|
||||
// 不需要额外加锁,但需要确保SDK实例的访问是线程安全的
|
||||
|
||||
Log($"[{DateTime.Now:HH:mm:ss.fff}] [线程:{Thread.CurrentThread.ManagedThreadId}] CheckConnectionValidity() - 开始检查连接有效性");
|
||||
try
|
||||
{
|
||||
// 记录当前状态信息
|
||||
Log($"[{DateTime.Now:HH:mm:ss.fff}] [线程:{Thread.CurrentThread.ManagedThreadId}] CheckConnectionValidity() - 当前状态: _currentDeviceId={_currentDeviceId}, _deviceIp={_deviceIp}, _a8Sdk={(null == _a8Sdk ? "null" : "存在")}");
|
||||
|
||||
// 重要修改:先检查设备ID有效性,避免后续无效检查
|
||||
// 重要修改:设备ID无效不再直接返回false,继续执行心跳检测
|
||||
if (_currentDeviceId == -1)
|
||||
{
|
||||
Log($"[{DateTime.Now:HH:mm:ss.fff}] [线程:{Thread.CurrentThread.ManagedThreadId}] CheckConnectionValidity() - 当前设备ID无效,返回false");
|
||||
return false;
|
||||
Log($"[{DateTime.Now:HH:mm:ss.fff}] [线程:{Thread.CurrentThread.ManagedThreadId}] CheckConnectionValidity() - 当前设备ID无效,继续执行心跳检测");
|
||||
}
|
||||
|
||||
// 优化1: 优先尝试ping设备IP地址,这是物理连接断开的最直接检测
|
||||
bool pingResult = PingDevice(_deviceIp);
|
||||
Log($"[{DateTime.Now:HH:mm:ss.fff}] [线程:{Thread.CurrentThread.ManagedThreadId}] CheckConnectionValidity() - ping检测结果: {pingResult}");
|
||||
if (!pingResult)
|
||||
{
|
||||
Log($"[{DateTime.Now:HH:mm:ss.fff}] [线程:{Thread.CurrentThread.ManagedThreadId}] CheckConnectionValidity() - 设备IP {_deviceIp} 不可达,物理连接可能已断开,返回false");
|
||||
@@ -2822,7 +2792,6 @@ namespace JoyD.Windows.CS.Toprie
|
||||
|
||||
// 优化2: 系统网络接口检测作为辅助检查,不再作为首要条件
|
||||
bool networkAvailable = IsNetworkAvailable();
|
||||
Log($"[{DateTime.Now:HH:mm:ss.fff}] [线程:{Thread.CurrentThread.ManagedThreadId}] CheckConnectionValidity() - 网络可用性检测结果: {networkAvailable}");
|
||||
if (!networkAvailable)
|
||||
{
|
||||
Log($"[{DateTime.Now:HH:mm:ss.fff}] [线程:{Thread.CurrentThread.ManagedThreadId}] CheckConnectionValidity() - 警告: 系统网络连接不可用,但ping检测通过");
|
||||
@@ -2838,7 +2807,6 @@ namespace JoyD.Windows.CS.Toprie
|
||||
// 先创建新实例,再原子赋值,避免中间状态
|
||||
A8SDK newSdk = new A8SDK(_deviceIp);
|
||||
_a8Sdk = newSdk;
|
||||
Log($"[{DateTime.Now:HH:mm:ss.fff}] [线程:{Thread.CurrentThread.ManagedThreadId}] CheckConnectionValidity() - SDK实例已创建");
|
||||
}
|
||||
|
||||
// 增强心跳检测重试机制,提高连接稳定性
|
||||
@@ -2849,18 +2817,15 @@ namespace JoyD.Windows.CS.Toprie
|
||||
{
|
||||
try
|
||||
{
|
||||
Log($"[{DateTime.Now:HH:mm:ss.fff}] [线程:{Thread.CurrentThread.ManagedThreadId}] CheckConnectionValidity() - SDK心跳检测...(尝试 {retry + 1}/{maxHeartbeatRetries + 1})");
|
||||
heartbeatResult = _a8Sdk.Heartbeat();
|
||||
|
||||
// 严格检查返回值,确保连接有效
|
||||
if (heartbeatResult == 1) // V8.Heartbeat()方法返回1表示成功
|
||||
{
|
||||
Log($"[{DateTime.Now:HH:mm:ss.fff}] [线程:{Thread.CurrentThread.ManagedThreadId}] CheckConnectionValidity() - SDK心跳检测成功");
|
||||
break;
|
||||
}
|
||||
else if (retry < maxHeartbeatRetries)
|
||||
{
|
||||
Log($"[{DateTime.Now:HH:mm:ss.fff}] [线程:{Thread.CurrentThread.ManagedThreadId}] CheckConnectionValidity() - SDK心跳检测失败,返回代码: {heartbeatResult},等待500ms后重试...");
|
||||
Thread.Sleep(500); // 增加重试间隔到500ms
|
||||
}
|
||||
else
|
||||
@@ -2878,6 +2843,7 @@ namespace JoyD.Windows.CS.Toprie
|
||||
if (heartbeatResult == 1)
|
||||
{
|
||||
Log($"[{DateTime.Now:HH:mm:ss.fff}] [线程:{Thread.CurrentThread.ManagedThreadId}] CheckConnectionValidity() - SDK重新连接成功");
|
||||
return true; // 重新连接成功,返回true
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -2885,14 +2851,13 @@ namespace JoyD.Windows.CS.Toprie
|
||||
}
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
catch
|
||||
{
|
||||
if (retry < maxHeartbeatRetries)
|
||||
{
|
||||
Log($"[{DateTime.Now:HH:mm:ss.fff}] [线程:{Thread.CurrentThread.ManagedThreadId}] CheckConnectionValidity() - 心跳检测异常: {ex.Message}");
|
||||
if (retry < maxHeartbeatRetries)
|
||||
{
|
||||
Thread.Sleep(500); // 增加重试间隔到500ms
|
||||
}
|
||||
Thread.Sleep(500); // 增加重试间隔到500ms
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (heartbeatResult != 1)
|
||||
|
||||
Reference in New Issue
Block a user