fix: 启动时强制清理所有残留数据,避免重复捕捉被跳过
问题:急停后恢复时,内存中的去重集(_seen_messages/_replied_texts) 和语义指纹缓存(_recent_user_queries/_semantic_fingerprint_cache) 残留上次已处理的消息,导致新轮次OCR捕捉到相同内容时, 虽然时间戳已达标但仍被去重逻辑跳过。 修复:在 start() 入口处新增 _force_clear_all_residual_data(), 清理所有内存去重/冷却/缓存状态,不触碰数据库持久化记录。 清理范围: - 消息去重集:_seen_messages, _replied_texts, _recent_processed_messages - 语义指纹:_recent_user_queries, _semantic_fingerprint_cache - 平台冷却:_last_reply_time, _last_new_msg_time, _failed_send_cooldown - OCR缓存:_last_texts, _raw_clipboard, _last_clipboard_hash, _app_variant - 响应式冷却:_foreground_cooldown_until, _self_reply_cooldown_until
This commit is contained in:
+34
-1
@@ -665,9 +665,40 @@ class MessageMonitor:
|
||||
def set_emergency_callback(self, cb: Callable[[], None]):
|
||||
self._emergency_stop_callback = cb
|
||||
|
||||
def _force_clear_all_residual_data(self):
|
||||
"""启动时强制清理所有残留数据,避免重复捕捉被时间戳达标而跳过。
|
||||
|
||||
问题场景:
|
||||
- 急停后恢复,_seen_messages/_replied_texts 中残留上次已处理的消息
|
||||
- _recent_user_queries 中残留上次查询的语义指纹
|
||||
- _semantic_fingerprint_cache 中残留同屏碎片指纹
|
||||
- 导致新轮次OCR捕捉到相同内容时,时间戳已达标但被去重逻辑跳过
|
||||
|
||||
清理范围:所有内存中的去重/冷却/缓存状态,不触碰数据库持久化记录。
|
||||
"""
|
||||
# 消息去重集
|
||||
self._seen_messages.clear()
|
||||
self._replied_texts.clear()
|
||||
self._recent_processed_messages.clear()
|
||||
self._recent_user_queries.clear()
|
||||
self._semantic_fingerprint_cache.clear()
|
||||
# 平台级时间戳冷却
|
||||
self._last_reply_time.clear()
|
||||
self._last_new_msg_time.clear()
|
||||
self._failed_send_cooldown.clear()
|
||||
self._failed_consecutive_count.clear()
|
||||
self._foreground_cooldown_until.clear()
|
||||
self._self_reply_cooldown_until.clear()
|
||||
# OCR/cache 状态
|
||||
self._last_texts.clear()
|
||||
self._raw_clipboard.clear()
|
||||
self._last_clipboard_hash.clear()
|
||||
self._app_variant.clear()
|
||||
logger.info("[start] 强制清理所有残留数据完成")
|
||||
|
||||
def start(self, full_restart: bool = False):
|
||||
"""启动监控。
|
||||
|
||||
|
||||
Args:
|
||||
full_restart: True=彻底重启(进程级,重新检测内存恢复GPU)
|
||||
False=急停/手动停止恢复(软重启,不重新检测内存)
|
||||
@@ -675,6 +706,8 @@ class MessageMonitor:
|
||||
if self._running:
|
||||
return
|
||||
self._running = True
|
||||
# ⭐ 启动时强制清理所有残留数据,避免重复捕捉被时间戳达标而跳过
|
||||
self._force_clear_all_residual_data()
|
||||
# ⭐ 重置 EasyOCR 状态:确保停止/急停后双引擎仍能搭档作业
|
||||
# stop() 会杀死子进程,但如果此时有 _call_easyocr_safe 在运行,
|
||||
# BrokenPipeError 会设置 _easyocr_broken=True,导致重启后 EasyOCR 永久不可用
|
||||
|
||||
Reference in New Issue
Block a user