feat: 重构媒体播放检测逻辑,使用后台STA线程持续监控并集成WinRT API。
This commit is contained in:
@@ -124,29 +124,54 @@ namespace TimerApp
|
||||
|
||||
private void OnTick()
|
||||
{
|
||||
// 在锁外执行耗时的系统检测
|
||||
long idleMs = 0;
|
||||
bool? newMediaPlaying = null;
|
||||
|
||||
lock (_lock)
|
||||
{
|
||||
// 如果处于暂停状态,不处理计时逻辑
|
||||
if (_isPaused)
|
||||
{
|
||||
return;
|
||||
}
|
||||
if (_isPaused) return;
|
||||
|
||||
long idleMs;
|
||||
TimeSpan idleTime;
|
||||
|
||||
// 优化:降低系统API调用频率
|
||||
// 每 CheckIntervalTicks (3) 秒更新一次状态
|
||||
// 检查是否需要更新状态
|
||||
_checkTickCounter++;
|
||||
if (_checkTickCounter >= CheckIntervalTicks)
|
||||
{
|
||||
_checkTickCounter = 0;
|
||||
_cachedIdleMs = NativeMethods.GetIdleTime();
|
||||
_cachedMediaPlaying = NativeMethods.IsMediaPlaying();
|
||||
// 需要更新,但在锁外进行
|
||||
newMediaPlaying = true;
|
||||
}
|
||||
|
||||
// 如果不需要更新,直接使用缓存值
|
||||
if (newMediaPlaying == null)
|
||||
{
|
||||
idleMs = _cachedIdleMs;
|
||||
}
|
||||
}
|
||||
|
||||
// 在锁外执行实际的检测
|
||||
if (newMediaPlaying == true)
|
||||
{
|
||||
idleMs = NativeMethods.GetIdleTime();
|
||||
bool playing = NativeMethods.IsMediaPlaying();
|
||||
|
||||
// 更新缓存
|
||||
lock (_lock)
|
||||
{
|
||||
_cachedIdleMs = idleMs;
|
||||
_cachedMediaPlaying = playing;
|
||||
}
|
||||
}
|
||||
|
||||
lock (_lock)
|
||||
{
|
||||
// 再次检查暂停状态
|
||||
if (_isPaused) return;
|
||||
|
||||
// 使用(可能是新更新的)缓存值
|
||||
idleMs = _cachedIdleMs;
|
||||
idleTime = TimeSpan.FromMilliseconds(idleMs);
|
||||
bool isMediaPlaying = _cachedMediaPlaying;
|
||||
TimeSpan idleTime = TimeSpan.FromMilliseconds(idleMs);
|
||||
|
||||
if (CurrentState == MonitorState.Resting)
|
||||
{
|
||||
@@ -170,9 +195,6 @@ namespace TimerApp
|
||||
}
|
||||
else
|
||||
{
|
||||
// 使用缓存的媒体播放状态
|
||||
bool isMediaPlaying = _cachedMediaPlaying;
|
||||
|
||||
// 工作/空闲模式逻辑
|
||||
if (idleTime > IdleThreshold || isMediaPlaying)
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user