Skip to content

fix: 灭屏暂停菜单栏定时器,修复菜单打开时速率冻结#3

Merged
PrintNow merged 3 commits into
mainfrom
fix/cpu-screen-sleep-and-menu-freeze
Jun 13, 2026
Merged

fix: 灭屏暂停菜单栏定时器,修复菜单打开时速率冻结#3
PrintNow merged 3 commits into
mainfrom
fix/cpu-screen-sleep-and-menu-freeze

Conversation

@PrintNow

Copy link
Copy Markdown
Owner

Summary

  • 灭屏 CPU 归零:新增 setupScreenObservers(),监听 screensDidSleepNotification / willSleepNotification 后立即 invalidate 菜单栏刷新定时器;screensDidWakeNotification / didWakeNotification 后重启。此前 NetworkSpeedMonitor 已正确在灭屏时停止采样,但 menuBarRefreshTimer 仍以 max(0.25s, sampleInterval) 频率触发主线程文本测宽,导致屏幕关闭后持续 ~1.2% CPU 占用。
  • 修复菜单打开时速率冻结:RunLoop 模式从 .default 改为 .common。菜单打开时 RunLoop 切换到 .eventTracking 模式,.default 模式的定时器不触发,导致速率显示冻结。
  • 减少冗余计算updateLabels() 仅在上/下行文本内容实际变化时才调用 reconcileSpeedLabelWidths()(含 2× NSString.size()),消除无流量变化时的空转测宽。

Test plan

  • 运行 App,打开菜单,确认速率数字在菜单打开期间持续刷新(不再冻结)
  • 执行 pmset displaysleepnow 关闭屏幕,等待 30 秒后唤醒,Activity Monitor 确认灭屏期间 NetMeter CPU% ≈ 0%,唤醒后速率恢复正常
  • xcodebuild test -scheme NetMeter -destination 'platform=macOS' 全部通过

PrintNow added 2 commits June 13, 2026 23:57
- MenuBarStatusController 新增 setupScreenObservers(),监听
  screensDidSleep/willSleep 通知后立即 invalidate 菜单栏刷新定时器,
  didWake/screensDidWake 后重启,消除灭屏状态下持续 ~1.2% 的 CPU 占用
- RunLoop 模式从 .default 改为 .common,确保菜单打开期间(RunLoop
  处于 .eventTracking 模式)定时器继续触发,修复速率显示冻结的 bug
- updateLabels() 仅在上/下行文本实际变化时才调用 reconcileSpeedLabelWidths(),
  减少无流量变化时的冗余文本测宽计算
@github-actions

github-actions Bot commented Jun 13, 2026

Copy link
Copy Markdown

CI 结果

步骤 状态 耗时
🔨 Build (arm64) ✅ 通过 30s
🧪 Tests ✅ 通过 19s

414e995b468e991ae02244698c3e6287cd512b6b · 查看完整日志

@PrintNow PrintNow merged commit fd8a07b into main Jun 13, 2026
1 check passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant