feat: 添加上证所截图独立线程并优化定时任务
- 新增 ScreenshotWorker 类专门处理上证所截图任务 - 将截图功能从主工作线程分离,避免阻塞 - 缩短截图爬取间隔至60秒 - 添加波形图数据点方法(暂未实现功能) - 更新.gitignore 忽略 .spec 文件 - 添加程序图标和截图资源文件
This commit is contained in:
1
.gitignore
vendored
1
.gitignore
vendored
@@ -1,6 +1,7 @@
|
||||
# Python
|
||||
__pycache__/
|
||||
*.py[cod]
|
||||
*.spec
|
||||
*$py.class
|
||||
*.so
|
||||
.Python
|
||||
|
||||
71
main.py
71
main.py
@@ -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}")
|
||||
|
||||
@@ -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 |
Reference in New Issue
Block a user