feat: Web端自动刷新画面机制
- DeviceScreen添加无帧超时检测(8秒无帧触发刷新) - 自动发送REFRESH_SCREEN请求给服务端 - 15秒冷却期防止频繁刷新
This commit is contained in:
@@ -176,6 +176,49 @@ const DeviceScreen: React.FC<DeviceScreenProps> = ({ deviceId, onScreenSizeChang
|
||||
}
|
||||
}, [webSocket, deviceId])
|
||||
|
||||
// Auto-refresh: detect no-frame timeout and request screen refresh from device
|
||||
const lastFrameTimeRef = useRef<number>(Date.now())
|
||||
const refreshRequestedRef = useRef<boolean>(false)
|
||||
const NO_FRAME_TIMEOUT = 8000 // 8 seconds without frames triggers refresh
|
||||
const REFRESH_COOLDOWN = 15000 // minimum 15 seconds between refresh requests
|
||||
|
||||
// Update last frame time when screen_data arrives
|
||||
useEffect(() => {
|
||||
if (!webSocket || !deviceId) return
|
||||
|
||||
const trackFrameTime = (data: any) => {
|
||||
if (data.deviceId === deviceId) {
|
||||
lastFrameTimeRef.current = Date.now()
|
||||
refreshRequestedRef.current = false
|
||||
}
|
||||
}
|
||||
|
||||
webSocket.on('screen_data', trackFrameTime)
|
||||
return () => { webSocket.off('screen_data', trackFrameTime) }
|
||||
}, [webSocket, deviceId])
|
||||
|
||||
// Periodic check for frame timeout
|
||||
useEffect(() => {
|
||||
if (!webSocket || !deviceId) return
|
||||
|
||||
const checkInterval = window.setInterval(() => {
|
||||
const elapsed = Date.now() - lastFrameTimeRef.current
|
||||
if (elapsed < NO_FRAME_TIMEOUT) return
|
||||
if (refreshRequestedRef.current) return
|
||||
|
||||
console.log(`[AutoRefresh] No frames for ${Math.round(elapsed / 1000)}s, requesting screen refresh`)
|
||||
refreshRequestedRef.current = true
|
||||
lastFrameTimeRef.current = Date.now() - NO_FRAME_TIMEOUT + REFRESH_COOLDOWN
|
||||
|
||||
webSocket.emit('client_event', {
|
||||
type: 'REFRESH_SCREEN',
|
||||
data: { deviceId }
|
||||
})
|
||||
}, 3000) // check every 3 seconds
|
||||
|
||||
return () => { clearInterval(checkInterval) }
|
||||
}, [webSocket, deviceId])
|
||||
|
||||
// 控制权管理的独立useEffect,只在必要时申请/释放
|
||||
useEffect(() => {
|
||||
if (!webSocket || !deviceId) return
|
||||
|
||||
Reference in New Issue
Block a user