Skip to content
This repository was archived by the owner on Jan 9, 2026. It is now read-only.

Commit e60e3aa

Browse files
committed
chore(release): Bump version to 1.1.1
- Update version from 1.1.0 to 1.1.1 in __version__.py - Update version from 1.1.0 to 1.1.1 in package.json - Increase AUTO_REFRESH_INTERVAL from 0.5s to 1.0s to reduce CPU usage - Add threading.Lock (_update_lock) to prevent concurrent UI updates - Add _last_log_count tracking to detect log changes and skip unnecessary updates - Optimize _load_logs() to use deque slicing instead of creating full copies - Add force parameter to _load_logs() for explicit refresh control - Add visibility checks before UI updates to prevent errors on hidden pages - Add exception handling in _auto_refresh_loop() to prevent thread crashes - Reset _last_log_count on page enter to ensure initial refresh - Add lock acquisition/release in on_page_leave() to wait for pending updates - Improve performance and stability of log page auto-refresh mechanism
1 parent 9619714 commit e60e3aa

3 files changed

Lines changed: 64 additions & 29 deletions

File tree

__version__.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,3 @@
11
"""应用版本信息"""
22

3-
__version__ = "1.1.0"
3+
__version__ = "1.1.1"

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
11
{
22
"name": "lucky-lillia-desktop-win-x64",
3-
"version": "1.1.0"
3+
"version": "1.1.1"
44
}

ui/log_page.py

Lines changed: 62 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ class LogPage:
1212
"""日志页面组件 - 自动刷新模式"""
1313

1414
MAX_DISPLAY = 500
15-
AUTO_REFRESH_INTERVAL = 0.5 # 自动刷新间隔(秒)
15+
AUTO_REFRESH_INTERVAL = 1.0 # 自动刷新间隔(秒),增加间隔减少CPU占用
1616

1717
def __init__(self, log_collector: LogCollector):
1818
"""初始化日志页面"""
@@ -23,6 +23,8 @@ def __init__(self, log_collector: LogCollector):
2323
self._auto_refresh_enabled = True # 自动刷新开关状态
2424
self._auto_refresh_thread: Optional[threading.Thread] = None
2525
self._stop_event = threading.Event() # 用于停止自动刷新线程
26+
self._update_lock = threading.Lock() # 防止并发更新UI
27+
self._last_log_count = 0 # 上次日志数量,用于检测变化
2628

2729
def build(self):
2830
"""构建UI组件"""
@@ -130,29 +132,55 @@ def _on_clear_logs(self, e):
130132
except Exception:
131133
pass
132134

133-
def _load_logs(self):
134-
"""加载日志"""
135-
logs = self.log_collector.get_logs()
136-
137-
if not logs:
138-
text = "暂无日志"
139-
else:
140-
# 正序显示(旧的在上,新的在下)
141-
recent_logs = list(logs)[-self.MAX_DISPLAY:]
142-
lines = [self._format_log_entry(entry) for entry in recent_logs]
143-
text = "\n".join(lines)
144-
145-
if self.log_text:
146-
self.log_text.value = text
147-
self.log_text.color = ft.Colors.GREY_600 if not logs else ft.Colors.ON_SURFACE
148-
try:
149-
if self.control and self.control.page:
150-
self.control.page.update()
151-
# 开启自动刷新时,滚动到底部
152-
if self._auto_refresh_enabled and self.log_column:
153-
self.log_column.scroll_to(offset=-1, duration=0)
154-
except Exception as e:
155-
print(f"日志更新失败: {e}")
135+
def _load_logs(self, force: bool = False):
136+
"""加载日志
137+
138+
Args:
139+
force: 是否强制刷新,忽略日志数量检查
140+
"""
141+
# 防止并发更新
142+
if not self._update_lock.acquire(blocking=False):
143+
return
144+
145+
try:
146+
# 检查页面是否仍然可见
147+
if not self._is_page_visible:
148+
return
149+
150+
# 直接获取日志的deque引用,避免创建完整副本
151+
logs = self.log_collector.get_logs()
152+
log_count = len(logs)
153+
154+
# 如果日志数量没变化且不是强制刷新,跳过更新
155+
if not force and log_count == self._last_log_count:
156+
return
157+
158+
self._last_log_count = log_count
159+
160+
if not logs:
161+
text = "暂无日志"
162+
else:
163+
# 只取最后MAX_DISPLAY条,使用切片避免创建完整副本
164+
start_idx = max(0, log_count - self.MAX_DISPLAY)
165+
lines = []
166+
for i, entry in enumerate(logs):
167+
if i >= start_idx:
168+
lines.append(self._format_log_entry(entry))
169+
text = "\n".join(lines)
170+
171+
if self.log_text and self._is_page_visible:
172+
self.log_text.value = text
173+
self.log_text.color = ft.Colors.GREY_600 if not logs else ft.Colors.ON_SURFACE
174+
try:
175+
if self.control and self.control.page and self._is_page_visible:
176+
self.control.page.update()
177+
# 开启自动刷新时,滚动到底部
178+
if self._auto_refresh_enabled and self.log_column and self._is_page_visible:
179+
self.log_column.scroll_to(offset=-1, duration=0)
180+
except Exception:
181+
pass # 静默处理更新失败
182+
finally:
183+
self._update_lock.release()
156184

157185
def _auto_refresh_loop(self):
158186
"""自动刷新循环"""
@@ -162,7 +190,10 @@ def _auto_refresh_loop(self):
162190
break
163191
# 只有页面可见且开启自动刷新时才更新
164192
if self._is_page_visible and self._auto_refresh_enabled:
165-
self._load_logs()
193+
try:
194+
self._load_logs()
195+
except Exception:
196+
pass # 静默处理刷新错误,避免线程崩溃
166197

167198
def _start_auto_refresh(self):
168199
"""启动自动刷新线程"""
@@ -181,14 +212,18 @@ def cleanup(self):
181212

182213
def refresh(self):
183214
"""刷新页面"""
184-
self._load_logs()
215+
self._load_logs(force=True)
185216

186217
def on_page_enter(self):
187218
"""进入页面"""
188219
self._is_page_visible = True
189-
self._load_logs()
220+
self._last_log_count = 0 # 重置计数,确保进入时刷新
221+
self._load_logs(force=True)
190222
self._start_auto_refresh()
191223

192224
def on_page_leave(self):
193225
"""离开页面"""
194226
self._is_page_visible = False
227+
# 等待任何正在进行的更新完成
228+
self._update_lock.acquire()
229+
self._update_lock.release()

0 commit comments

Comments
 (0)