修复停止按钮死循环和消息落库问题
This commit is contained in:
@@ -599,6 +599,9 @@ class MsgBotApp(ctk.CTk):
|
||||
self.ar.set_enabled(self.cfg.get("auto_reply_enabled", False))
|
||||
self.ar.set_min_score(self.cfg.get("auto_reply_min_score", 0.35))
|
||||
|
||||
# ⭐ 防止 _update_stop_ui() 中 deselect() 触发 _toggle_monitor() 回调的标志
|
||||
self._suppress_toggle_callback = False
|
||||
|
||||
self._build_ui()
|
||||
|
||||
# 定时从队列取日志刷新
|
||||
@@ -805,12 +808,21 @@ class MsgBotApp(ctk.CTk):
|
||||
# ── 回调 ──────────────────────────────
|
||||
|
||||
def _toggle_monitor(self):
|
||||
# ⭐ 防止 _update_stop_ui() 中 deselect() 触发的回调
|
||||
if self._suppress_toggle_callback:
|
||||
return
|
||||
|
||||
enabled = self._toggle_btn.get()
|
||||
if enabled:
|
||||
# 检查知识库是否已加载
|
||||
if not self.kb.is_ready:
|
||||
self._log("⚠ 知识库未加载,请先设置知识库路径")
|
||||
self._toggle_btn.deselect()
|
||||
# 设置标志防止 deselect() 触发回调
|
||||
self._suppress_toggle_callback = True
|
||||
try:
|
||||
self._toggle_btn._variable.set(False)
|
||||
finally:
|
||||
self.after(100, lambda: setattr(self, '_suppress_toggle_callback', False))
|
||||
return
|
||||
# 用户手动点击启用 → 彻底重启(重新检测内存,尝试恢复GPU)
|
||||
self.monitor.start(full_restart=True)
|
||||
@@ -1442,7 +1454,15 @@ class MsgBotApp(ctk.CTk):
|
||||
|
||||
def _update_stop_ui(self):
|
||||
"""主线程更新急停后的 UI(stop 放到后台线程,主线程不冻结)。"""
|
||||
self._toggle_btn.deselect()
|
||||
# ⭐ 设置标志防止 deselect() 触发 _toggle_monitor() 回调
|
||||
self._suppress_toggle_callback = True
|
||||
try:
|
||||
# 直接设置开关变量值,不触发回调
|
||||
self._toggle_btn._variable.set(False)
|
||||
finally:
|
||||
# 延迟重置标志,确保回调已被跳过
|
||||
self.after(100, lambda: setattr(self, '_suppress_toggle_callback', False))
|
||||
|
||||
self._status_label.configure(text="⏸ 急停")
|
||||
self._log_queue.put("🔄 可点击「启用监控」重新启动")
|
||||
# ⭐ UI 立即更新;stop() 在后台线程执行,主线程保持响应,不再触发冻结弹窗。
|
||||
|
||||
Reference in New Issue
Block a user