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