From 0e3ea2abc75aa548f31478afa6217bff10615dfd Mon Sep 17 00:00:00 2001 From: youpaishidifu Date: Sun, 30 Aug 2026 19:07:58 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E9=87=8D=E5=A4=8D?= =?UTF-8?q?=E6=9F=A5=E9=87=8D=E5=AF=BC=E8=87=B4=E6=B6=88=E6=81=AF=E8=A2=AB?= =?UTF-8?q?=E8=AF=AF=E8=B7=B3=E8=BF=87=EF=BC=88Task=20#1642=20follow-up?= =?UTF-8?q?=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- monitor.py | 47 +++++++++++++++++++++++++++++------------------ 1 file changed, 29 insertions(+), 18 deletions(-) diff --git a/monitor.py b/monitor.py index 7eb597d..6845cf1 100644 --- a/monitor.py +++ b/monitor.py @@ -1076,22 +1076,35 @@ class MessageMonitor: self._qq_thread.start() threading.Thread(target=_delayed_qq_start, daemon=True, name="qq-delay").start() - # 第3批:EasyOCR预热(延迟1s,最重的操作放最后) - if _HAS_EASYOCR and not self._easyocr_broken: - # ⭐ 代际计数器:防止死循环中旧预热线程在新 start() 后醒来错误初始化 EasyOCR - self._easyocr_warmup_generation += 1 - _gen = self._easyocr_warmup_generation - def _delayed_easyocr_start(): - time.sleep(1.0) - # ⭐ 双重检查:self._running + 代际匹配,防止死循环中的旧线程执行 - if self._running and self._easyocr_warmup_generation == _gen: + # 第3批:OCR引擎预热(延迟1s,同时预热Windows OCR和EasyOCR) + self._easyocr_warmup_generation += 1 + _gen = self._easyocr_warmup_generation + def _delayed_ocr_warmup(): + time.sleep(1.0) + # ⭐ 双重检查:self._running + 代际匹配,防止死循环中的旧线程执行 + if self._running and self._easyocr_warmup_generation == _gen: + # 1. 预热Windows OCR引擎 + self._gui_log("🔧 正在预热OCR引擎...") + try: + self._ocr_ensure_engine() + if self._ocr_engine: + self._gui_log("✅ Windows OCR引擎就绪") + else: + self._gui_log("⚠ Windows OCR引擎创建失败") + except Exception as e: + self._gui_log(f"⚠ Windows OCR预热异常: {e}") + + # 2. 预热EasyOCR子进程 + if _HAS_EASYOCR and not self._easyocr_broken: self._gui_log("🔧 EasyOCR 子进程初始化中...") self._ensure_easyocr_subprocess() - threading.Thread(target=_delayed_easyocr_start, daemon=True, name="easyocr-delay").start() - elif not _HAS_EASYOCR: - self._gui_log("⚠ EasyOCR 不可用(导入失败),仅使用 Windows OCR") - elif self._easyocr_broken: - self._gui_log("⚠ EasyOCR 已标记损坏,跳过初始化") + elif not _HAS_EASYOCR: + self._gui_log("⚠ EasyOCR 不可用(导入失败),仅使用 Windows OCR") + elif self._easyocr_broken: + self._gui_log("⚠ EasyOCR 已标记损坏,跳过初始化") + + self._gui_log("✅ OCR引擎预热完成") + threading.Thread(target=_delayed_ocr_warmup, daemon=True, name="ocr-warmup-delay").start() logger.info("消息监控已启动") @@ -10172,10 +10185,8 @@ class MessageMonitor: # ⭐ Task #1572: 记录OCR消息到暂存表(用于后续查重) if self._msg_history: # ⭐ 数据库查重:重复率≥50%就跳过该条消息(continue继续处理下一条) - if self._msg_history._is_similar_to_history(platform, _cleaned, threshold=0.5): - logger.info(f"[{platform}] 轮询消息去重: 与历史消息相似,跳过: {_cleaned[:60]!r}") - self._last_new_msg_time[platform] = time.time() - continue # 跳过该条,继续处理下一条 + # ⚠️ 注意:这里不再查重,因为第10106行已经查过了(且用了exclude_self=True排除自身) + # 如果在这里再查一次,刚入库的消息会被自身匹配上,导致误跳过 try: self._msg_history.record_ocr_message(platform, _cleaned) except Exception as e: