feat: 添加上证所截图独立线程并优化定时任务

- 新增 ScreenshotWorker 类专门处理上证所截图任务
- 将截图功能从主工作线程分离,避免阻塞
- 缩短截图爬取间隔至60秒
- 添加波形图数据点方法(暂未实现功能)
- 更新.gitignore 忽略 .spec 文件
- 添加程序图标和截图资源文件
This commit is contained in:
2026-01-14 14:39:44 +08:00
parent e90bbfec7d
commit 2a560108df
5 changed files with 72 additions and 4 deletions

1
.gitignore vendored
View File

@@ -1,6 +1,7 @@
# Python
__pycache__/
*.py[cod]
*.spec
*$py.class
*.so
.Python

BIN
guba.ico Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 165 KiB

71
main.py
View File

@@ -15,6 +15,48 @@ from llm_analyzer import LLMAnalyzer
from main_window import MainWindow
class ScreenshotWorker(QObject):
"""截图工作器 - 专门处理上证所截图"""
sse_screenshot_fetched = Signal(str)
error_occurred = Signal(str)
def __init__(self, spider: SpiderManager):
super().__init__()
self.spider = spider
self.running = False
logger.info("ScreenshotWorker 初始化完成")
def start(self):
"""启动截图任务"""
self.running = True
logger.info("截图任务已启动")
def stop(self):
"""停止截图任务"""
self.running = False
logger.info("截图任务已停止")
def do_fetch(self):
"""执行截图获取"""
if not self.running:
return
try:
logger.info("开始爬取上证所网页截图")
screenshot_path = self.spider.fetch_sse_screenshot()
if screenshot_path:
logger.info(f"成功获取截图: {screenshot_path}")
self.sse_screenshot_fetched.emit(screenshot_path)
else:
logger.warning("未能获取有效的截图")
except Exception as e:
logger.error(f"爬取截图失败: {str(e)}")
self.error_occurred.emit(f"截图失败: {str(e)}")
class BackendWorker(QObject):
"""后台工作器 - 处理爬取和分析任务"""
@@ -289,11 +331,23 @@ def main():
# 线程结束时停止工作
worker_thread.finished.connect(worker.stop)
# 创建截图后台线程
logger.info("创建截图后台线程...")
screenshot_worker = ScreenshotWorker(spider)
screenshot_thread = QThread()
screenshot_worker.moveToThread(screenshot_thread)
screenshot_thread.started.connect(screenshot_worker.start)
screenshot_thread.finished.connect(screenshot_worker.stop)
# 创建主窗口
logger.info("创建主窗口...")
window = MainWindow(config, spider)
window.show()
# 连接截图信号在创建window后连接
screenshot_worker.sse_screenshot_fetched.connect(window.update_sse_screenshot)
screenshot_worker.error_occurred.connect(lambda msg: logger.error(msg))
# 连接信号
worker.status_update.connect(window.update_status)
worker.analysis_finished.connect(window.update_indicator)
@@ -313,17 +367,21 @@ def main():
worker_thread.start()
logger.info("后台线程已启动")
# 启动截图后台线程
screenshot_thread.start()
logger.info("截图后台线程已启动")
# 启动股票数据爬取定时器
stock_timer = QTimer()
stock_timer.timeout.connect(worker.fetch_stock_data)
stock_timer.start(60000) # 每分钟爬取一次股票数据
logger.info("股票数据爬取定时器已启动间隔60秒")
# 启动上证所截图爬取定时器
# 启动上证所截图爬取定时器(使用独立的截图线程,不再阻塞主循环)
screenshot_timer = QTimer()
screenshot_timer.timeout.connect(worker.fetch_sse_screenshot)
screenshot_timer.start(300000) # 每5分钟爬取一次截图
logger.info("上证所截图爬取定时器已启动,间隔300秒")
screenshot_timer.timeout.connect(screenshot_worker.do_fetch)
screenshot_timer.start(60000) # 每1分钟爬取一次截图
logger.info("上证所截图爬取定时器已启动,间隔60秒")
# 确保应用退出时清理线程
def cleanup():
@@ -332,6 +390,11 @@ def main():
worker_thread.quit()
worker_thread.wait()
# 停止截图线程
screenshot_worker.stop()
screenshot_thread.quit()
screenshot_thread.wait()
# 显示统计信息
logger.info("=== 程序运行统计 ===")
logger.info(f"爬取网站次数: {worker.fetch_count}")

View File

@@ -451,6 +451,10 @@ class MainWindow(QWidget):
self.screenshot_label.setText("截图加载失败")
logger.warning("截图加载失败")
def add_waveform_data(self, time_str: str, value: float):
"""添加波形图数据点(暂未实现波形图功能)"""
logger.debug(f"波形图数据: 时间={time_str}, 值={value}")
class QCheckBox(QPushButton):
"""自定义复选框"""

Binary file not shown.

Before

Width:  |  Height:  |  Size: 42 KiB

After

Width:  |  Height:  |  Size: 55 KiB