重试 链接
This commit is contained in:
parent
29360dcb96
commit
ebb0c9eb31
@ -32,6 +32,13 @@ namespace Wpf_AiSportsMicrospace.Views
|
|||||||
public WebcamClient WebcamClient { get; private set; }
|
public WebcamClient WebcamClient { get; private set; }
|
||||||
private readonly ConcurrentQueue<VideoFrame> _frameQueue = new();
|
private readonly ConcurrentQueue<VideoFrame> _frameQueue = new();
|
||||||
private readonly CancellationTokenSource _cts = new();
|
private readonly CancellationTokenSource _cts = new();
|
||||||
|
private DateTime _lastFrameTime = DateTime.Now;
|
||||||
|
private const int HeartbeatTimeoutMs = 5000; // 5秒内未收到帧则视为断线
|
||||||
|
private const int RetryIntervalMs = 3000; // 每3秒重试一次
|
||||||
|
private const int MaxRetryCount = 5;
|
||||||
|
private bool _isReconnecting = false;
|
||||||
|
private readonly object _reconnectLock = new();
|
||||||
|
|
||||||
public Main()
|
public Main()
|
||||||
{
|
{
|
||||||
InitializeComponent();
|
InitializeComponent();
|
||||||
@ -51,7 +58,8 @@ namespace Wpf_AiSportsMicrospace.Views
|
|||||||
|
|
||||||
// 开始抽帧线程
|
// 开始抽帧线程
|
||||||
StartFrameProcessing();
|
StartFrameProcessing();
|
||||||
|
// 启动心跳检测线程
|
||||||
|
StartHeartbeatMonitor();
|
||||||
// 默认显示首页
|
// 默认显示首页
|
||||||
MainContent.Content = new Home();
|
MainContent.Content = new Home();
|
||||||
}
|
}
|
||||||
@ -115,6 +123,84 @@ namespace Wpf_AiSportsMicrospace.Views
|
|||||||
|
|
||||||
public event EventHandler<List<Human>> HumanFrameUpdated;
|
public event EventHandler<List<Human>> HumanFrameUpdated;
|
||||||
|
|
||||||
|
private void StartHeartbeatMonitor()
|
||||||
|
{
|
||||||
|
Task.Run(async () =>
|
||||||
|
{
|
||||||
|
while (!_cts.Token.IsCancellationRequested)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
var elapsed = (DateTime.Now - _lastFrameTime).TotalMilliseconds;
|
||||||
|
if (elapsed > HeartbeatTimeoutMs && !_isReconnecting)
|
||||||
|
{
|
||||||
|
Console.WriteLine("检测到摄像头断线,准备重连...");
|
||||||
|
await TryReconnectAsync();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
Console.WriteLine($"HeartbeatMonitor error: {ex.Message}");
|
||||||
|
}
|
||||||
|
|
||||||
|
await Task.Delay(HeartbeatTimeoutMs / 2, _cts.Token);
|
||||||
|
}
|
||||||
|
}, _cts.Token);
|
||||||
|
}
|
||||||
|
private async Task TryReconnectAsync()
|
||||||
|
{
|
||||||
|
lock (_reconnectLock)
|
||||||
|
{
|
||||||
|
if (_isReconnecting)
|
||||||
|
return;
|
||||||
|
_isReconnecting = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
int retryCount = 0;
|
||||||
|
bool success = false;
|
||||||
|
|
||||||
|
while (retryCount < MaxRetryCount && !_cts.Token.IsCancellationRequested)
|
||||||
|
{
|
||||||
|
retryCount++;
|
||||||
|
Console.WriteLine($"尝试第 {retryCount} 次重连摄像头...");
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
WebcamClient?.StopExtract();
|
||||||
|
WebcamClient = SportOperate.CreateRTSP();
|
||||||
|
|
||||||
|
if (WebcamClient != null)
|
||||||
|
{
|
||||||
|
WebcamClient.OnExtractFrame += frame =>
|
||||||
|
{
|
||||||
|
_lastFrameTime = DateTime.Now;
|
||||||
|
_frameQueue.Enqueue(frame);
|
||||||
|
};
|
||||||
|
WebcamClient.StartExtract();
|
||||||
|
success = true;
|
||||||
|
Console.WriteLine("摄像头重连成功!");
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
Console.WriteLine($"重连失败: {ex.Message}");
|
||||||
|
}
|
||||||
|
|
||||||
|
await Task.Delay(RetryIntervalMs);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!success)
|
||||||
|
{
|
||||||
|
Application.Current.Dispatcher.Invoke(() =>
|
||||||
|
{
|
||||||
|
HandyControl.Controls.MessageBox.Show("摄像头连接失败,请检查网络或设备!");
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
_isReconnecting = false;
|
||||||
|
}
|
||||||
|
|
||||||
public void SwitchPage(UserControl newPage, bool fromRight)
|
public void SwitchPage(UserControl newPage, bool fromRight)
|
||||||
{
|
{
|
||||||
if (MainContent.Content == newPage) return;
|
if (MainContent.Content == newPage) return;
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user