fix: 修复重复查重导致消息被误跳过(Task #1642 follow-up)

This commit is contained in:
youpaishidifu
2026-08-30 19:07:58 +08:00
parent bbc00f2c8b
commit 0e3ea2abc7
+29 -18
View File
@@ -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: