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):
|
def set_collector(self, c):
|
||||||
self._collector = c
|
self._collector = c
|
||||||
|
|
||||||
def on_mount(self):
|
def refresh(self):
|
||||||
self._timer = self.set_interval(2, self._refresh_stats)
|
"""由外部 asyncio task 驱动刷新(比 set_interval 更抗 Android 挂起)"""
|
||||||
|
self._refresh_stats()
|
||||||
def _refresh_stats(self):
|
|
||||||
try:
|
try:
|
||||||
if not self._collector:
|
if not self._collector:
|
||||||
self.update("📊 系统监控: 数据源未连接")
|
self.update("📊 系统监控: 数据源未连接")
|
||||||
@@ -477,12 +476,13 @@ class PluginStatusPanel(Static):
|
|||||||
self._plugin_service = plugin_service
|
self._plugin_service = plugin_service
|
||||||
self._timer = None
|
self._timer = None
|
||||||
|
|
||||||
def on_mount(self):
|
|
||||||
self._timer = self.set_interval(3, self._refresh)
|
|
||||||
|
|
||||||
def set_plugin_service(self, svc):
|
def set_plugin_service(self, svc):
|
||||||
self._plugin_service = svc
|
self._plugin_service = svc
|
||||||
|
|
||||||
|
def refresh(self):
|
||||||
|
"""由外部 asyncio task 驱动刷新"""
|
||||||
|
self._refresh()
|
||||||
|
|
||||||
def _refresh(self):
|
def _refresh(self):
|
||||||
try:
|
try:
|
||||||
if not self._plugin_service:
|
if not self._plugin_service:
|
||||||
@@ -784,7 +784,10 @@ class TuiService:
|
|||||||
|
|
||||||
# 启动消息处理任务
|
# 启动消息处理任务
|
||||||
self._message_processor_task = asyncio.create_task(self._process_message_queue())
|
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
|
# 在后台运行TUI
|
||||||
asyncio.create_task(self._run_tui())
|
asyncio.create_task(self._run_tui())
|
||||||
|
|
||||||
@@ -850,6 +853,17 @@ class TuiService:
|
|||||||
except Exception as e:
|
except Exception as e:
|
||||||
logger.error(f"消息处理任务出错: {str(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):
|
def _setup_title(self):
|
||||||
"""设置TUI标题"""
|
"""设置TUI标题"""
|
||||||
try:
|
try:
|
||||||
@@ -886,6 +900,8 @@ class TuiService:
|
|||||||
def shutdown(self):
|
def shutdown(self):
|
||||||
"""关闭TUI服务"""
|
"""关闭TUI服务"""
|
||||||
try:
|
try:
|
||||||
|
if hasattr(self, '_refresh_task') and self._refresh_task:
|
||||||
|
self._refresh_task.cancel()
|
||||||
if self.tui_app:
|
if self.tui_app:
|
||||||
self.tui_app.shutdown()
|
self.tui_app.shutdown()
|
||||||
print("TUI服务已关闭")
|
print("TUI服务已关闭")
|
||||||
|
|||||||
Reference in New Issue
Block a user