fix: 系统监控改用 asyncio task 驱动,抗 Android 后台挂起
- SystemMonitor/PluginStatusPanel: 移除 set_interval, 改用外部 refresh() - TuiService._refresh_monitors(): asyncio.sleep(2) 循环刷新 - asyncio.sleep 在 Android 恢复前台后能正常续跑 - shutdown 时 cancel refresh task Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
+24
-8
@@ -425,10 +425,9 @@ class SystemMonitor(Static):
|
||||
def set_collector(self, c):
|
||||
self._collector = c
|
||||
|
||||
def on_mount(self):
|
||||
self._timer = self.set_interval(2, self._refresh_stats)
|
||||
|
||||
def _refresh_stats(self):
|
||||
def refresh(self):
|
||||
"""由外部 asyncio task 驱动刷新(比 set_interval 更抗 Android 挂起)"""
|
||||
self._refresh_stats()
|
||||
try:
|
||||
if not self._collector:
|
||||
self.update("📊 系统监控: 数据源未连接")
|
||||
@@ -477,12 +476,13 @@ class PluginStatusPanel(Static):
|
||||
self._plugin_service = plugin_service
|
||||
self._timer = None
|
||||
|
||||
def on_mount(self):
|
||||
self._timer = self.set_interval(3, self._refresh)
|
||||
|
||||
def set_plugin_service(self, svc):
|
||||
self._plugin_service = svc
|
||||
|
||||
def refresh(self):
|
||||
"""由外部 asyncio task 驱动刷新"""
|
||||
self._refresh()
|
||||
|
||||
def _refresh(self):
|
||||
try:
|
||||
if not self._plugin_service:
|
||||
@@ -784,7 +784,10 @@ class TuiService:
|
||||
|
||||
# 启动消息处理任务
|
||||
self._message_processor_task = asyncio.create_task(self._process_message_queue())
|
||||
|
||||
|
||||
# 启动后台刷新任务 (asyncio.sleep 比 set_interval 更抗 Android 挂起)
|
||||
self._refresh_task = asyncio.create_task(self._refresh_monitors())
|
||||
|
||||
# 在后台运行TUI
|
||||
asyncio.create_task(self._run_tui())
|
||||
|
||||
@@ -850,6 +853,17 @@ class TuiService:
|
||||
except Exception as e:
|
||||
logger.error(f"消息处理任务出错: {str(e)}")
|
||||
|
||||
async def _refresh_monitors(self):
|
||||
"""后台刷新系统监控 + 插件面板 (asyncio.sleep, Android 挂起后可恢复)"""
|
||||
try:
|
||||
while True:
|
||||
if self.tui_app:
|
||||
self.tui_app.system_monitor.refresh()
|
||||
self.tui_app.plugin_panel.refresh()
|
||||
await asyncio.sleep(2)
|
||||
except asyncio.CancelledError:
|
||||
logger.debug("监控刷新任务被取消")
|
||||
|
||||
def _setup_title(self):
|
||||
"""设置TUI标题"""
|
||||
try:
|
||||
@@ -886,6 +900,8 @@ class TuiService:
|
||||
def shutdown(self):
|
||||
"""关闭TUI服务"""
|
||||
try:
|
||||
if hasattr(self, '_refresh_task') and self._refresh_task:
|
||||
self._refresh_task.cancel()
|
||||
if self.tui_app:
|
||||
self.tui_app.shutdown()
|
||||
print("TUI服务已关闭")
|
||||
|
||||
Reference in New Issue
Block a user