You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
91 lines
2.9 KiB
91 lines
2.9 KiB
#!/usr/bin/env python3
|
|
"""
|
|
Session Worker Thread - vzug-e-hinge
|
|
====================================
|
|
QThread worker for non-blocking session execution.
|
|
|
|
This worker runs session.start_session() or session.resume_session()
|
|
in a background thread, preventing GUI freezing and enabling
|
|
real-time status updates.
|
|
|
|
IMPORTANT: Creates thread-local database connection to avoid SQLite
|
|
threading errors.
|
|
|
|
Author: Kynsight
|
|
Version: 1.1.0
|
|
Date: 2025-11-09
|
|
"""
|
|
|
|
from PyQt6.QtCore import QThread, pyqtSignal
|
|
import sqlite3
|
|
|
|
|
|
class SessionWorker(QThread):
|
|
"""
|
|
Worker thread for session execution.
|
|
|
|
Runs session.start_session() or resume_session() in background
|
|
to prevent GUI blocking. Emits finished signal when session completes.
|
|
|
|
CRITICAL: Creates a new database connection in the worker thread
|
|
to avoid SQLite's "objects created in a thread can only be used
|
|
in that same thread" error.
|
|
"""
|
|
|
|
# Signals
|
|
finished = pyqtSignal(bool) # success/failure
|
|
|
|
def __init__(self, session, db_path, resume_mode=False):
|
|
"""
|
|
Initialize worker.
|
|
|
|
Args:
|
|
session: Session instance to execute
|
|
db_path: Path to database file (for thread-local connection)
|
|
resume_mode: True to resume, False to start (default)
|
|
"""
|
|
super().__init__()
|
|
self.session = session
|
|
self.db_path = db_path
|
|
self.resume_mode = resume_mode
|
|
|
|
def run(self):
|
|
"""
|
|
Execute session in background thread.
|
|
|
|
This method runs in a separate thread, keeping the GUI responsive.
|
|
Creates a thread-local database connection to avoid SQLite errors.
|
|
All session signals (status_changed, command_started, etc.) are
|
|
automatically thread-safe thanks to Qt's signal/slot mechanism.
|
|
"""
|
|
try:
|
|
# Create thread-local database connection
|
|
thread_db_conn = sqlite3.connect(self.db_path)
|
|
|
|
# Replace session's database connection with thread-local one
|
|
old_conn = self.session.db_conn
|
|
self.session.db_conn = thread_db_conn
|
|
|
|
try:
|
|
if self.resume_mode:
|
|
# Resume paused session
|
|
self.session.resume_session()
|
|
success = True
|
|
else:
|
|
# Start new session
|
|
success = self.session.start_session()
|
|
|
|
# Emit result
|
|
self.finished.emit(success)
|
|
|
|
finally:
|
|
# Close thread-local connection
|
|
thread_db_conn.close()
|
|
|
|
# Restore original connection
|
|
self.session.db_conn = old_conn
|
|
|
|
except Exception as e:
|
|
print(f"[ERROR] Worker exception: {e}")
|
|
self.finished.emit(False)
|