修复急停冻结/消息hash跳过/正常调度冷却误触三处问题
1. 急停冻结: gui.py 将 monitor.stop() 移到后台线程执行,避免 terminate+wait 阻塞 GUI 主线程 6~8s 触发 Windows 冻结弹窗;窗口关闭同样后台 stop。 2. 消息丢失: 仅当上一帧 OCR 已成功入队才允许相同 hash 帧跳过;新增 _is_question_message 提问豁免,使继承极老时间戳的明确提问(如'资源包是强制的,还是可选的?')不再被误判为远古历史永久丢弃。 3. 正常调度冷却: 正常资源释放(每N次调用杀进程)清除残留 30s 冷却并重置失败计数器;正常重启握手阶段的初始化超时/崩溃/协议/握手错误不再施加 30s 冷静期,交由系统自行调度启停。
This commit is contained in:
@@ -435,15 +435,33 @@ class MsgBotApp(ctk.CTk):
|
||||
# 安全更新 toggle 状态(主线程 after 调度)
|
||||
self.after(0, self._update_stop_ui)
|
||||
|
||||
def _stop_monitor_async(self):
|
||||
"""后台线程执行 monitor.stop(),避免阻塞 GUI 主线程触发 Windows 冻结弹窗。
|
||||
|
||||
stop() 内含多个线程 join + _kill_easyocr_proc(terminate+wait 最多 6s),
|
||||
同步在 GUI 主线程执行会冻结 6~8s,触发系统"软件无响应"弹窗。
|
||||
"""
|
||||
try:
|
||||
self.monitor.stop()
|
||||
except Exception as e:
|
||||
logger.warning(f"[gui] 后台 stop 异常: {e}")
|
||||
|
||||
def _update_stop_ui(self):
|
||||
"""主线程更新急停后的 UI。"""
|
||||
self.monitor.stop()
|
||||
"""主线程更新急停后的 UI(stop 放到后台线程,主线程不冻结)。"""
|
||||
self._toggle_btn.deselect()
|
||||
self._status_label.configure(text="⏸ 急停")
|
||||
self._log_queue.put("🔄 可点击「启用监控」重新启动")
|
||||
# ⭐ UI 立即更新;stop() 在后台线程执行,主线程保持响应,不再触发冻结弹窗。
|
||||
threading.Thread(target=self._stop_monitor_async, daemon=True, name="gui-stop").start()
|
||||
|
||||
# ── 窗口关闭 ──
|
||||
|
||||
def _on_close(self):
|
||||
self.monitor.stop()
|
||||
self.destroy()
|
||||
# ⭐ 关闭窗口同样把 stop 放到后台线程,完成后再关闭,避免主线程冻结。
|
||||
def _stop_then_close():
|
||||
try:
|
||||
self.monitor.stop()
|
||||
except Exception:
|
||||
pass
|
||||
self.after(0, self.destroy)
|
||||
threading.Thread(target=_stop_then_close, daemon=True, name="gui-stop-close").start()
|
||||
|
||||
Reference in New Issue
Block a user