fix: 修复重复查重导致消息被误跳过(Task #1642 follow-up)
This commit is contained in:
+29
-18
@@ -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:
|
||||
|
||||
Reference in New Issue
Block a user